From f758834918eeb886f1f79540e375d1fff153a6f5 Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Sat, 4 Feb 2017 14:16:45 -0800 Subject: [PATCH 1/4] Allow choosing logit scale in qt figure options. --- lib/matplotlib/backends/qt_editor/figureoptions.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/backends/qt_editor/figureoptions.py b/lib/matplotlib/backends/qt_editor/figureoptions.py index 824db2c7bd76..d7062d694317 100644 --- a/lib/matplotlib/backends/qt_editor/figureoptions.py +++ b/lib/matplotlib/backends/qt_editor/figureoptions.py @@ -54,12 +54,12 @@ def figure_edit(axes, parent=None): (None, "X-Axis"), ('Min', xmin), ('Max', xmax), ('Label', axes.get_xlabel()), - ('Scale', [axes.get_xscale(), 'linear', 'log']), + ('Scale', [axes.get_xscale(), 'linear', 'log', 'logit']), sep, (None, "Y-Axis"), ('Min', ymin), ('Max', ymax), ('Label', axes.get_ylabel()), - ('Scale', [axes.get_yscale(), 'linear', 'log']), + ('Scale', [axes.get_yscale(), 'linear', 'log', 'logit']), sep, ('(Re-)Generate automatic legend', False), ] From 5bc8b835ca05dbf811f61762e7d3a8ef0cdd4fb1 Mon Sep 17 00:00:00 2001 From: Haran Nisakaran Date: Sat, 4 Mar 2017 13:05:13 -0500 Subject: [PATCH 2/4] Fix for issue #7741 --- lib/matplotlib/axes/_axes.py | 2 +- lib/matplotlib/text.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 5ffd8a7bae08..b7a9790f2fe2 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -635,7 +635,7 @@ def text(self, x, y, s, fontdict=None, x=x, y=y, text=s) else: t = mtext.Text( - x=x, y=y, text=s) + x=x, y=y, text=s, usetex=kwargs.get('usetex')) t.update(default) if fontdict is not None: diff --git a/lib/matplotlib/text.py b/lib/matplotlib/text.py index 9e2d8be26842..828a79c4d8e3 100644 --- a/lib/matplotlib/text.py +++ b/lib/matplotlib/text.py @@ -1261,6 +1261,7 @@ def set_usetex(self, usetex): self._usetex = rcParams['text.usetex'] else: self._usetex = bool(usetex) + rcParams['text.usetex'] = self._usetex self.stale = True def get_usetex(self): From 76e3693cf0d31e59cc0e25c9792224f5ea30e6fb Mon Sep 17 00:00:00 2001 From: Isa Hassen Date: Sat, 18 Mar 2017 14:19:34 -0400 Subject: [PATCH 3/4] update (#7) * Update documentation of stem changed here: https://github.com/matplotlib/matplotlib/commit/d68662a54adc84370362d4ef7965101c5b060e3e * Update vlines example with axes wide lines. * Clean up BoundaryNorm docstring * Document what happens when ncolors > bins * BoundaryNorm docstring clarification * BoundaryNorm docstring formatting * Added set_xlim and set_ylim check for non-finite limit values * FIX: masked images with interpolation When determining which pixels to mask in the resampled image, if _any_ contribution to final value comes from a masked pixel, mask the result. Due to Agg special-casing the meaning of the alpha channel, the interpolation for the mask channel needs to be done separately. This is probably a template for doing the over/under separately. print out exact hash on travis * Cleaned up invalid axis limit warning text * FIX tick label alignment can now be specified This patch adds two new rcParams allowing to set label alignment. The sole reason for the existance of these new parameters is to allow user to reset the style to before 2.0 for testing purposes. More specifically, ytick horizontal alignement was changed in a non backward compatible way. xtick vertical alignement was added for API consistency. closes #7905 * MAINT created a new private _classic_test stylesheet This allows the public classic stylesheet to be 'more' backward compatible * FIX small nitpicks * Template-ize visual_tests.py. * Pass missing variable to format string. * Simplify dictionary access in visual_tests.py. * PEP8 visual_tests.py. * Sort results in visual test HTML. This makes the result a bit more reproducable and comparable. * Don't start a browser for visual tests on CI. Travis may or may not have a browser installed, but AppVeyor definitely does, so this saves a tiny bit of processing power per run. * Move visual_tests into tools. * Add tools directory to pep8. * pgf: Fix invalid arguments passed to pdftocairo. This breaks saving PNG when using the PGF backend. Fixes #8121. * MAINT Backporting of #7995. Set sticky_edges correctly for negative height bar(). * Small docstring fixes * merge fill_demo and fill_demo_features * move imports below title * Merge docstring coherent * Plot errorbars if fmt=='none' * Add test for fmt=='none' * Fix small spelling mistake * Check plotted bars are color C0 * Add cleanup to new test * Simplify multicolored_line example * Move multicolored_line example * Small fixes * Put boundarynorm example back in * Add autoclass entry for Artist API doc. Adding an autoclass entry in the Artist API ensures that that class appears in the intersphinx `build/html/object.inv`, as can be checked by ``` "matplotlib.artist.Artist" in ( sphinx.ext.intersphinx.read_inventory( open("build/html/objects.inv", "rb"), None, lambda *args: None)[ "py:class"]) ``` (now returns True). This allows other projects to link to that class in their docs using ``` `Artist` ``` This possibility used to be present, but disappeared when the Artist API doc got refactored. (Other classes that appear in the API docs are fine as they already use autoclass.) * Merge pull request #8171 from afvincent/typo_eventplot_docstring DOC: Fix small typos in 'eventplot' docstring * Fix layout of spectrum_demo.py * Beautified spectrum_demo.py a little more. * Added plot titles to spectrum_demo.py * Correct theta values when drawing a non-circular ellipse Make arcs work with units Add api change not for elliptical notes Add background ellipse and extra line to test Remove pdf and svg tests for arc angles * Fix small typo in api change * add gitter link in README * add a line to README that explains use of gitter * Fixes #8141 Validators for dashed linestyles now allow None as an allowed value along with floats through optional `allow_none` kwarg in validate_nseq_float. Other validators that use validate_nseq_float arent affected * Replace second instance of gitter badge with a link * TST: Enable cache directories on AppVeyor. * Use secure links to FreeType tarballs. * Try harder to cache FreeType tarball on Python 2. * TST: Always delete extra cache files on Travis. Note, we don't need to do this on AppVeyor because the cache directories are different. * add parameter and test * implemented label rotation * pep8 fix * DOC moved autowarp_demo to sphinx-gallery compatible docstring * DOC spines example are now sphinx-gallery compliant * DOC all tick labels examples are now sphinx-gallery compatible * DOC moved text_demo_fontdict to sphinx-gallery compatible docstring * TST: skip fc-list related tests if not installed * DOC FIX removed a blank line from an example * DOC moving showcase examples to sphinx-gallery * Plural of axis is axes * add early check for dot binary (from graphviz) when building the doc * Clarify segment array shape * Make ginput dostring into a numpydocstring Small fixes Add default value for npoints Suggested changes to ginput docstring Better description of ginput return Put summary line by itself at the top Add in missing full stops * Implement Path.intersects_bbox in C++ to speed up legend positioning. * DOC removed/added blankspace * DOC fixe small typos and blank lines * DOC capitalized firefox * renamed flag to 'rotatelabels'; fix vertical alignment * Update spines_demo.py * MEP12 alignment_test * Move alignment_test example * MEP12 and simplify ganged_plots example * Move ganged plots example * pep8 fix * added headers * added/fixed headers * DOC removed redundant call to plt.show() * DOC added docstring to vline-hline example. * fix gitter badge * Set subplot spacing to zero * Clean up description wording * fix rst markup * Fix pep8 violation * Fix example description phrasing * Remove image with non-free color calibration profile The example that used to use this image was remove already in commit 9692c31. This closes #8034. * MAINT Backporting of #8241: remove possible non-free image * Ignore invisible axes in computing tight_layout. * combining and updating 2d hist examples * consolidating histogram examples and moving to SG folder * Memoize parse_fontconfig_pattern; speeds up test suite by ~1min. On my laptop this patch drops the duration of the test suite from 604s to 554s (with the inkscape patch on as well). * addressing small change comments * Contouring 1x1 array (issue 8197) * another attempt; add a test * Set __name__ for list validators in rcsetup. This avoids having many validators all named `f`, which makes profiling a bit difficult (it appears that repeated validation of rcparams when resetting the style at the beginning of each test instance contributes quite a bit to the total test time). Instead, the list validator based on scalar validator function `validate_foo` is now `__name__`d `validate_foolist`, and the list validator based on scalar validator class `ValidateFoo` is now `__name__`d `ValidateFooList`. * TST: fail on missing baseline file * re-add conditional check. * DOC moved spines examples sphinx-gallery * Use sys.executable -msphinx instead of sphinx-build. * More robust type checking in '_validate_linestyle', on both Py2 and Py3 * tests now depend on python version to check cases with bytes args * DOC changes in travis's build environment * DOC removed duplicate appveyor py3.5 environment * CI: travis runs documentation build and mac osx only on merge with master * MAINT remove py.test from our travis build * FIX appveyor doesn't need option USE_PYTEST anymore * append test images. * removed obsolete license.py file * DOC moved changelog to the documentation * DOC fix broken links * MAINT moved some maintenance and helper python scripts to tools/ * FIX path in boilerplate.py * Small header comment fixes * Removes OldScalarFormatter * Renaming file to scalarformatter_demo.py * Renaming to plot_scalarformatter.py * Adds title and description * changing name in backend_driver.py * Inkscape shell mode. * Fix minimum sphinx version in doc-requirements.txt. * Correcting typos and moving file to ticks and spines * STY: fix whitespace in the tests * Remove executable bit from examples and headers. The vast majority of examples do not have the executable bit set, so just make everything consistent. Also remove `#!/usr/bin/env python` where appropriate. * DOC shapes and collections is fully SG compatible * Use neutral pronoun in docs. --- .travis.yml | 55 +- Makefile | 1 - README.rst | 9 +- appveyor.yml | 21 +- ci/travis/test_script.sh | 43 + doc-requirements.txt | 2 +- .../2017-02-10-DS_elliptical_arc_angle.rst | 8 + .../2017-02-26-MB_intersects_bbox.rst | 21 + doc/api/artist_api.rst | 1 + doc/conf.py | 11 + doc/devel/coding_guide.rst | 4 - doc/devel/documenting_mpl.rst | 2 +- doc/make.py | 36 +- doc/users/artists.rst | 2 +- doc/users/dflt_style_changes.rst | 1 + .../users/prev_whats_new/changelog.rst | 310 +-- doc/users/pyplot_tutorial.rst | 2 +- doc/users/screenshots.rst | 2 +- doc/users/whats_new.rst | 1 + .../whats_new/invalid_axes_limits_errors.rst | 6 + examples/api/power_norm_demo.py | 0 examples/event_handling/keypress_demo.py | 0 examples/event_handling/pick_event_demo.py | 0 examples/event_handling/pipong.py | 0 examples/event_handling/pong_gtk.py | 0 examples/lines_bars_and_markers/fill_demo.py | 21 +- .../fill_demo_features.py | 21 - .../multicolored_line.py | 48 + examples/misc/ftface_props.py | 0 examples/mplot3d/2dcollections3d_demo.py | 10 +- examples/mplot3d/bars3d_demo.py | 8 +- examples/mplot3d/hist3d_demo.py | 8 +- examples/mplot3d/pathpatch3d_demo.py | 9 +- examples/mplot3d/polys3d_demo.py | 13 +- examples/pylab_examples/agg_buffer.py | 0 examples/pylab_examples/anscombe.py | 0 examples/pylab_examples/bar_stacked.py | 0 examples/pylab_examples/color_demo.py | 0 examples/pylab_examples/contour_demo.py | 0 examples/pylab_examples/contour_image.py | 0 examples/pylab_examples/contourf_demo.py | 0 examples/pylab_examples/contourf_hatching.py | 0 examples/pylab_examples/coords_demo.py | 0 examples/pylab_examples/cursor_demo.py | 0 examples/pylab_examples/custom_ticker1.py | 0 examples/pylab_examples/equal_aspect_ratio.py | 0 examples/pylab_examples/eventplot_demo.py | 0 examples/pylab_examples/font_table_ttf.py | 0 examples/pylab_examples/ganged_plots.py | 45 - .../pylab_examples/ginput_manual_clabel.py | 0 examples/pylab_examples/hist2d_demo.py | 13 - examples/pylab_examples/hist2d_log_demo.py | 15 - examples/pylab_examples/hist_colormapped.py | 27 - .../pylab_examples/histogram_percent_demo.py | 19 - examples/pylab_examples/image_clip_path.py | 0 examples/pylab_examples/image_demo2.py | 0 examples/pylab_examples/image_origin.py | 0 examples/pylab_examples/logo.py | 0 examples/pylab_examples/mathtext_demo.py | 0 examples/pylab_examples/mathtext_examples.py | 0 examples/pylab_examples/matshow.py | 0 examples/pylab_examples/movie_demo.py | 0 examples/pylab_examples/mri_demo.py | 0 examples/pylab_examples/mri_with_eeg.py | 0 examples/pylab_examples/multicolored_line.py | 53 - examples/pylab_examples/nan_test.py | 0 examples/pylab_examples/polar_legend.py | 0 examples/pylab_examples/quadmesh_demo.py | 0 examples/pylab_examples/scatter_profile.py | 0 examples/pylab_examples/spectrum_demo.py | 48 +- examples/pylab_examples/stix_fonts_demo.py | 0 examples/pylab_examples/symlog_demo.py | 0 examples/pylab_examples/tex_unicode_demo.py | 0 examples/pylab_examples/vline_hline_demo.py | 8 +- examples/pylab_examples/zorder_demo.py | 0 examples/pyplots/boxplot_demo.py | 1 - .../pyplots/whats_new_98_4_fill_between.py | 1 - ..._reference.py => plot_artist_reference.py} | 0 ...{path_patch_demo.py => plot_path_patch.py} | 3 + .../{scatter_demo.py => plot_scatter.py} | 0 examples/showcase/firefox.py | 2 + examples/showcase/xkcd.py | 7 + examples/statistics/plot_hist.py | 102 + .../subplots_axes_and_figures/ganged_plots.py | 40 + examples/tests/backend_driver.py | 3 +- .../autowrap_demo.py | 10 +- .../text_alignment.py} | 22 +- .../text_demo_fontdict.py | 8 +- .../plot_scalarformatter.py} | 40 +- ...s_demo_bounds.py => plot_spines_bounds.py} | 4 + examples/ticks_and_spines/spines_demo.py | 26 +- .../ticks_and_spines/spines_demo_dropped.py | 4 + examples/ticks_and_spines/tick-formatters.py | 6 +- examples/ticks_and_spines/tick-locators.py | 6 +- .../tick_labels_from_values.py | 7 +- .../ticklabels_demo_rotation.py | 4 + examples/user_interfaces/embedding_in_gtk3.py | 0 examples/user_interfaces/embedding_in_qt4.py | 0 examples/user_interfaces/embedding_in_qt5.py | 0 examples/user_interfaces/embedding_in_tk.py | 0 .../user_interfaces/embedding_in_tk_canvas.py | 0 examples/user_interfaces/embedding_in_wx3.py | 0 examples/user_interfaces/interactive.py | 0 examples/user_interfaces/mpl_with_glade.py | 0 examples/user_interfaces/svg_histogram.py | 0 examples/widgets/cursor.py | 0 examples/widgets/span_selector.py | 0 .../include/agg_rasterizer_cells_aa.h | 0 .../include/agg_rasterizer_compound_aa.h | 0 lib/matplotlib/axes/_axes.py | 26 +- lib/matplotlib/axes/_base.py | 33 +- lib/matplotlib/backends/backend_pgf.py | 7 +- lib/matplotlib/colors.py | 45 +- lib/matplotlib/contour.py | 4 + lib/matplotlib/figure.py | 37 +- lib/matplotlib/fontconfig_pattern.py | 23 +- lib/matplotlib/image.py | 50 +- .../sample_data/necked_tensile_specimen.png | Bin 95151 -> 0 bytes .../mpl-data/stylelib/_classic_test.mplstyle | 526 +++++ .../mpl-data/stylelib/classic.mplstyle | 2 + lib/matplotlib/patches.py | 20 +- lib/matplotlib/path.py | 13 +- lib/matplotlib/pyplot.py | 4 +- lib/matplotlib/rcsetup.py | 76 +- .../sphinxext/tests/test_tinypages.py | 46 +- lib/matplotlib/testing/compare.py | 118 +- lib/matplotlib/testing/decorators.py | 58 +- .../baseline_images/test_axes/arc_angles.png | Bin 0 -> 25491 bytes ...ick_label_multiple_old_label_alignment.png | Bin 0 -> 8084 bytes .../test_axes/pie_rotatelabels_true.png | Bin 0 -> 64009 bytes .../imshow_masked_interpolation.pdf | Bin 0 -> 27055 bytes .../imshow_masked_interpolation.png | Bin 0 -> 19273 bytes .../imshow_masked_interpolation.svg | 185 ++ .../test_image/mask_image_over_under.png | Bin 27283 -> 27319 bytes .../test_tightlayout/tight_layout9.pdf | Bin 0 -> 6066 bytes .../test_tightlayout/tight_layout9.png | Bin 0 -> 18802 bytes .../test_tightlayout/tight_layout9.svg | 1017 ++++++++++ lib/matplotlib/tests/test_axes.py | 89 +- lib/matplotlib/tests/test_contour.py | 91 +- lib/matplotlib/tests/test_cycles.py | 2 +- lib/matplotlib/tests/test_font_manager.py | 11 +- lib/matplotlib/tests/test_image.py | 37 + lib/matplotlib/tests/test_rcparams.py | 56 +- lib/matplotlib/tests/test_tightlayout.py | 10 + lib/matplotlib/tests/test_triangulation.py | 75 + lib/matplotlib/tight_layout.py | 6 +- lib/matplotlib/tri/_tri_wrapper.cpp | 10 + license.py | 63 - pytest.ini | 8 +- setupext.py | 22 +- src/_contour_wrapper.cpp | 9 + src/_path.h | 60 + src/_path_wrapper.cpp | 34 + src/doc/segment_intersects_rectangle.svg | 1689 +++++++++++++++++ tools/README.txt | 1 + boilerplate.py => tools/boilerplate.py | 2 +- tools/make_icons.py | 2 +- tools/{test_triage.py => triage_tests.py} | 13 +- tools/visualize_tests.py | 137 ++ visual_tests.py | 92 - 160 files changed, 5119 insertions(+), 890 deletions(-) create mode 100644 ci/travis/test_script.sh create mode 100644 doc/api/api_changes/2017-02-10-DS_elliptical_arc_angle.rst create mode 100644 doc/api/api_changes/2017-02-26-MB_intersects_bbox.rst rename CHANGELOG => doc/users/prev_whats_new/changelog.rst (96%) create mode 100644 doc/users/whats_new/invalid_axes_limits_errors.rst mode change 100755 => 100644 examples/api/power_norm_demo.py mode change 100755 => 100644 examples/event_handling/keypress_demo.py mode change 100755 => 100644 examples/event_handling/pick_event_demo.py mode change 100755 => 100644 examples/event_handling/pipong.py mode change 100755 => 100644 examples/event_handling/pong_gtk.py delete mode 100644 examples/lines_bars_and_markers/fill_demo_features.py create mode 100644 examples/lines_bars_and_markers/multicolored_line.py mode change 100755 => 100644 examples/misc/ftface_props.py mode change 100755 => 100644 examples/pylab_examples/agg_buffer.py mode change 100755 => 100644 examples/pylab_examples/anscombe.py mode change 100755 => 100644 examples/pylab_examples/bar_stacked.py mode change 100755 => 100644 examples/pylab_examples/color_demo.py mode change 100755 => 100644 examples/pylab_examples/contour_demo.py mode change 100755 => 100644 examples/pylab_examples/contour_image.py mode change 100755 => 100644 examples/pylab_examples/contourf_demo.py mode change 100755 => 100644 examples/pylab_examples/contourf_hatching.py mode change 100755 => 100644 examples/pylab_examples/coords_demo.py mode change 100755 => 100644 examples/pylab_examples/cursor_demo.py mode change 100755 => 100644 examples/pylab_examples/custom_ticker1.py mode change 100755 => 100644 examples/pylab_examples/equal_aspect_ratio.py mode change 100755 => 100644 examples/pylab_examples/eventplot_demo.py mode change 100755 => 100644 examples/pylab_examples/font_table_ttf.py delete mode 100644 examples/pylab_examples/ganged_plots.py mode change 100755 => 100644 examples/pylab_examples/ginput_manual_clabel.py delete mode 100644 examples/pylab_examples/hist2d_demo.py delete mode 100644 examples/pylab_examples/hist2d_log_demo.py delete mode 100644 examples/pylab_examples/hist_colormapped.py delete mode 100644 examples/pylab_examples/histogram_percent_demo.py mode change 100755 => 100644 examples/pylab_examples/image_clip_path.py mode change 100755 => 100644 examples/pylab_examples/image_demo2.py mode change 100755 => 100644 examples/pylab_examples/image_origin.py mode change 100755 => 100644 examples/pylab_examples/logo.py mode change 100755 => 100644 examples/pylab_examples/mathtext_demo.py mode change 100755 => 100644 examples/pylab_examples/mathtext_examples.py mode change 100755 => 100644 examples/pylab_examples/matshow.py mode change 100755 => 100644 examples/pylab_examples/movie_demo.py mode change 100755 => 100644 examples/pylab_examples/mri_demo.py mode change 100755 => 100644 examples/pylab_examples/mri_with_eeg.py delete mode 100644 examples/pylab_examples/multicolored_line.py mode change 100755 => 100644 examples/pylab_examples/nan_test.py mode change 100755 => 100644 examples/pylab_examples/polar_legend.py mode change 100755 => 100644 examples/pylab_examples/quadmesh_demo.py mode change 100755 => 100644 examples/pylab_examples/scatter_profile.py mode change 100755 => 100644 examples/pylab_examples/stix_fonts_demo.py mode change 100755 => 100644 examples/pylab_examples/symlog_demo.py mode change 100755 => 100644 examples/pylab_examples/tex_unicode_demo.py mode change 100755 => 100644 examples/pylab_examples/zorder_demo.py rename examples/shapes_and_collections/{artist_reference.py => plot_artist_reference.py} (100%) rename examples/shapes_and_collections/{path_patch_demo.py => plot_path_patch.py} (89%) rename examples/shapes_and_collections/{scatter_demo.py => plot_scatter.py} (100%) create mode 100644 examples/statistics/plot_hist.py create mode 100644 examples/subplots_axes_and_figures/ganged_plots.py mode change 100755 => 100644 examples/tests/backend_driver.py rename examples/{pylab_examples/alignment_test.py => text_labels_and_annotations/text_alignment.py} (82%) rename examples/{pylab_examples/newscalarformatter_demo.py => ticks_and_spines/plot_scalarformatter.py} (75%) rename examples/ticks_and_spines/{spines_demo_bounds.py => plot_spines_bounds.py} (93%) mode change 100755 => 100644 examples/user_interfaces/embedding_in_gtk3.py mode change 100755 => 100644 examples/user_interfaces/embedding_in_qt4.py mode change 100755 => 100644 examples/user_interfaces/embedding_in_qt5.py mode change 100755 => 100644 examples/user_interfaces/embedding_in_tk.py mode change 100755 => 100644 examples/user_interfaces/embedding_in_tk_canvas.py mode change 100755 => 100644 examples/user_interfaces/embedding_in_wx3.py mode change 100755 => 100644 examples/user_interfaces/interactive.py mode change 100755 => 100644 examples/user_interfaces/mpl_with_glade.py mode change 100755 => 100644 examples/user_interfaces/svg_histogram.py mode change 100755 => 100644 examples/widgets/cursor.py mode change 100755 => 100644 examples/widgets/span_selector.py mode change 100755 => 100644 extern/agg24-svn/include/agg_rasterizer_cells_aa.h mode change 100755 => 100644 extern/agg24-svn/include/agg_rasterizer_compound_aa.h delete mode 100644 lib/matplotlib/mpl-data/sample_data/necked_tensile_specimen.png create mode 100644 lib/matplotlib/mpl-data/stylelib/_classic_test.mplstyle create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/arc_angles.png create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/bar_tick_label_multiple_old_label_alignment.png create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/pie_rotatelabels_true.png create mode 100644 lib/matplotlib/tests/baseline_images/test_image/imshow_masked_interpolation.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_image/imshow_masked_interpolation.png create mode 100644 lib/matplotlib/tests/baseline_images/test_image/imshow_masked_interpolation.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_tightlayout/tight_layout9.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_tightlayout/tight_layout9.png create mode 100644 lib/matplotlib/tests/baseline_images/test_tightlayout/tight_layout9.svg delete mode 100644 license.py create mode 100644 src/doc/segment_intersects_rectangle.svg create mode 100644 tools/README.txt rename boilerplate.py => tools/boilerplate.py (99%) rename tools/{test_triage.py => triage_tests.py} (96%) create mode 100644 tools/visualize_tests.py delete mode 100644 visual_tests.py diff --git a/.travis.yml b/.travis.yml index 77fc2f8963c3..eac4d4f82e32 100644 --- a/.travis.yml +++ b/.travis.yml @@ -48,26 +48,26 @@ env: - PYTEST_ARGS="-ra --maxfail=1 --timeout=300 --durations=25 --cov-report= --cov=lib -n $NPROC" - PYTHON_ARGS= - DELETE_FONT_CACHE= - - USE_PYTEST=false matrix: include: - python: 2.7 - env: MOCK=mock NUMPY=numpy==1.7.1 + env: MOCK=mock NUMPY=numpy==1.7.1 PANDAS=pandas + - python: 2.7 + env: BUILD_DOCS=true - python: 3.4 env: PYTHON_ARGS=-OO - python: 3.5 env: BUILD_DOCS=true - - python: 3.5 - env: USE_PYTEST=true PANDAS=pandas DELETE_FONT_CACHE=1 - python: 3.6 - env: USE_PYTEST=true DELETE_FONT_CACHE=1 INSTALL_PEP8=pytest-pep8 RUN_PEP8=--pep8 + env: DELETE_FONT_CACHE=1 INSTALL_PEP8=pytest-pep8 RUN_PEP8=--pep8 - python: "nightly" env: PRE=--pre - os: osx osx_image: xcode7.3 language: generic # https://github.com/travis-ci/travis-ci/issues/2312 env: MOCK=mock + only: master cache: # As for now travis caches only "$HOME/.cache/pip" # https://docs.travis-ci.com/user/caching/#pip-cache @@ -102,9 +102,12 @@ before_install: fi install: + # Upgrade pip and setuptools. Mock has issues with the default version of + # setuptools - | # Setup environment ccache -s + git describe # Upgrade pip and setuptools and wheel to get as clean an install as possible pip install --upgrade pip pip install --upgrade wheel @@ -138,46 +141,8 @@ install: # Install matplotlib pip install -ve . -script: - # The number of processes is hardcoded, because using too many causes the - # Travis VM to run out of memory (since so many copies of inkscape and - # ghostscript are running at the same time). - - | - echo Testing import of tkagg backend - MPLBACKEND="tkagg" python -c 'import matplotlib.pyplot as plt; print(plt.get_backend())' - if [[ $BUILD_DOCS == false ]]; then - if [[ $DELETE_FONT_CACHE == 1 ]]; then - rm -rf ~/.cache/matplotlib - fi - # Workaround for pytest-xdist flaky collection order - # https://github.com/pytest-dev/pytest/issues/920 - # https://github.com/pytest-dev/pytest/issues/1075 - export PYTHONHASHSEED=$(python -c 'import random; print(random.randint(1, 4294967295))') - echo PYTHONHASHSEED=$PYTHONHASHSEED - - echo The following args are passed to pytest $PYTEST_ARGS $RUN_PEP8 - if [[ $USE_PYTEST == false ]]; then - if [[ $TRAVIS_OS_NAME == 'osx' ]]; then - python tests.py $PYTEST_ARGS $RUN_PEP8 - else - gdb -return-child-result -batch -ex r -ex bt --args python $PYTHON_ARGS tests.py $PYTEST_ARGS $RUN_PEP8 - fi - else - py.test $PYTEST_ARGS $RUN_PEP8 - fi - else - cd doc - python make.py html -n 2 - # We don't build the LaTeX docs here, so linkchecker will complain - touch build/html/Matplotlib.pdf - # Linkchecker only works with python 2.7 for the time being - deactivate - source ~/virtualenv/python2.7/bin/activate - pip install pip --upgrade - # linkchecker is currently broken with requests 2.10.0 so force an earlier version - pip install $PRE requests==2.9.2 linkchecker - linkchecker build/html/index.html - fi +script: source ci/travis/test_script.sh +before_cache: - rm -rf $HOME/.cache/matplotlib/tex.cache - rm -rf $HOME/.cache/matplotlib/test_cache diff --git a/Makefile b/Makefile index 397e45c61513..2bd8077d5e6e 100644 --- a/Makefile +++ b/Makefile @@ -21,7 +21,6 @@ clean: release: ${DISTFILES} rm -f MANIFEST;\ - ${PYTHON} license.py ${VERSION} license/LICENSE;\ ${PYTHON} setup.py sdist --formats=gztar,zip; pyback: diff --git a/README.rst b/README.rst index 150e025ddd61..f60c4cca7b0e 100644 --- a/README.rst +++ b/README.rst @@ -13,9 +13,8 @@ .. |PyPi| image:: https://badge.fury.io/py/matplotlib.svg .. _PyPi: https://badge.fury.io/py/matplotlib -.. |Gitter| image:: https://badges.gitter.im/Join%20Chat.svg - :alt: Join the chat at https://gitter.im/matplotlib/matplotlib -.. _Gitter: https://gitter.im/matplotlib/matplotlib?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge +.. |Gitter| image:: https://img.shields.io/gitter/room/nwjs/nw.js.svg + :target: https://gitter.im/matplotlib/matplotlib?utm_source=share-link&utm_medium=link&utm_campaign=share-link .. |Depsy| image:: http://depsy.org/api/package/pypi/matplotlib/badge.svg .. _Depsy: http://depsy.org/package/python/matplotlib @@ -61,11 +60,9 @@ matplotlib's communication channels include active mailing lists: * `Announcement `_ mailing list: matplotlib-announce@python.org * `Development `_ mailing list: matplotlib-devel@python.org - The first is a good starting point for general questions and discussions. - - +`Gitter `_ is for coordinating development and asking questions directly related to contributing to matplotlib. Contribute ========== diff --git a/appveyor.yml b/appveyor.yml index df916cd9de9b..510208ab98d1 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -15,7 +15,6 @@ environment: # Workaround for https://github.com/conda/conda-build/issues/636 PYTHONIOENCODING: "UTF-8" PYTEST_ARGS: -ra --timeout=300 --durations=25 -n %NUMBER_OF_PROCESSORS% --cov-report= --cov=lib -m "not network" - USE_PYTEST: no PYTHONHASHSEED: 0 # Workaround for pytest-xdist flaky collection order # https://github.com/pytest-dev/pytest/issues/920 # https://github.com/pytest-dev/pytest/issues/1075 @@ -37,13 +36,6 @@ environment: PYTHON_VERSION: "3.5" TEST_ALL: "no" CONDA_INSTALL_LOCN: "C:\\Miniconda35-x64" - - TARGET_ARCH: "x64" - CONDA_PY: "35" - CONDA_NPY: "110" - PYTHON_VERSION: "3.5" - TEST_ALL: "no" - CONDA_INSTALL_LOCN: "C:\\Miniconda35-x64" - USE_PYTEST: yes - TARGET_ARCH: "x86" CONDA_PY: "27" CONDA_NPY: "18" @@ -63,8 +55,12 @@ platform: # all our python builds have to happen in tests_script... build: false +cache: + - '%LOCALAPPDATA%\pip\Cache' + - '%USERPROFILE%\.cache\matplotlib' + init: - - cmd: "ECHO %PYTHON_VERSION% PYTEST=%USE_PYTEST% %CONDA_INSTALL_LOCN%" + - cmd: "ECHO %PYTHON_VERSION% %CONDA_INSTALL_LOCN%" install: - cmd: set PATH=%CONDA_INSTALL_LOCN%;%CONDA_INSTALL_LOCN%\scripts;%PATH%; @@ -136,10 +132,9 @@ test_script: - python -c "import matplotlib as m; m.use('tkagg'); import matplotlib.pyplot as plt; print(plt.get_backend())" # tests - echo The following args are passed to pytest %PYTEST_ARGS% - - if x%USE_PYTEST% == xyes py.test %PYTEST_ARGS% - - if x%USE_PYTEST% == xno python tests.py %PYTEST_ARGS% + - python tests.py %PYTEST_ARGS% # Generate a html for visual tests - - python visual_tests.py + - python tools/visualize_tests.py --no-browser - pip install codecov - codecov -e PYTHON_VERSION PLATFORM @@ -180,7 +175,7 @@ artifacts: on_finish: on_failure: - - python visual_tests.py + - python tools/visualize_tests.py --no-browser - echo zipping images after a failure... - 7z a result_images.zip result_images\ |grep -v "Compressing" - appveyor PushArtifact result_images.zip diff --git a/ci/travis/test_script.sh b/ci/travis/test_script.sh new file mode 100644 index 000000000000..21ee11fee066 --- /dev/null +++ b/ci/travis/test_script.sh @@ -0,0 +1,43 @@ +#! /bin/bash + +# This script is meant to be called by the "script" step defined in +# .travis.yml. See http://docs.travis-ci.com/ for more details. +# The behavior of the script is controlled by environment variabled defined +# in the .travis.yml in the top level folder of the project. + +# The number of processes is hardcoded, because using too many causes the +# Travis VM to run out of memory (since so many copies of inkscape and +# ghostscript are running at the same time). + +echo Testing import of tkagg backend +MPLBACKEND="tkagg" python -c 'import matplotlib.pyplot as plt; print(plt.get_backend())' + +if [[ $BUILD_DOCS == false ]]; then + if [[ $DELETE_FONT_CACHE == 1 ]]; then + rm -rf ~/.cache/matplotlib + fi + # Workaround for pytest-xdist flaky collection order + # https://github.com/pytest-dev/pytest/issues/920 + # https://github.com/pytest-dev/pytest/issues/1075 + export PYTHONHASHSEED=$(python -c 'import random; print(random.randint(1, 4294967295))') + echo PYTHONHASHSEED=$PYTHONHASHSEED + + echo The following args are passed to pytest $PYTEST_ARGS $RUN_PEP8 + if [[ $TRAVIS_OS_NAME == 'osx' ]]; then + python tests.py $PYTEST_ARGS $RUN_PEP8 + else + gdb -return-child-result -batch -ex r -ex bt --args python $PYTHON_ARGS tests.py $PYTEST_ARGS $RUN_PEP8 + fi +else + cd doc + python make.py html -n 2 + # We don't build the LaTeX docs here, so linkchecker will complain + touch build/html/Matplotlib.pdf + # Linkchecker only works with python 2.7 for the time being + deactivate + source ~/virtualenv/python2.7/bin/activate + pip install pip --upgrade + # linkchecker is currently broken with requests 2.10.0 so force an earlier version + pip install $PRE requests==2.9.2 linkchecker + linkchecker build/html/index.html +fi diff --git a/doc-requirements.txt b/doc-requirements.txt index e62282562ea0..5d3f8759a0a7 100644 --- a/doc-requirements.txt +++ b/doc-requirements.txt @@ -6,7 +6,7 @@ # Install the documentation requirements with: # pip install -r doc-requirements.txt # -sphinx>1.0,!=1.5.0 +sphinx>=1.3,!=1.5.0 numpydoc ipython mock diff --git a/doc/api/api_changes/2017-02-10-DS_elliptical_arc_angle.rst b/doc/api/api_changes/2017-02-10-DS_elliptical_arc_angle.rst new file mode 100644 index 000000000000..1570a17d9549 --- /dev/null +++ b/doc/api/api_changes/2017-02-10-DS_elliptical_arc_angle.rst @@ -0,0 +1,8 @@ +Elliptical arcs now drawn between correct angles +```````````````````````````````````````````````` + +The `matplotlib.patches.Arc` patch is now correctly drawn between the given +angles. + +Previously a circular arc was drawn and then stretched into an ellipse, +so the resulting arc did not lie between *theta1* and *theta2*. diff --git a/doc/api/api_changes/2017-02-26-MB_intersects_bbox.rst b/doc/api/api_changes/2017-02-26-MB_intersects_bbox.rst new file mode 100644 index 000000000000..ed866b219362 --- /dev/null +++ b/doc/api/api_changes/2017-02-26-MB_intersects_bbox.rst @@ -0,0 +1,21 @@ +Path.intersects_bbox always treats the bounding box as filled +````````````````````````````````````````````````````````````` + +Previously, when ``Path.intersects_bbox`` was called with ``filled`` set to +``False``, it would treat both the path and the bounding box as unfilled. This +behavior was not well documented and it is usually not the desired behavior, +since bounding boxes are used to represent more complex shapes located inside +the bounding box. This behavior has now been changed: when ``filled`` is +``False``, the path will be treated as unfilled, but the bounding box is still +treated as filled. The old behavior was arguably an implementation bug. + +When ``Path.intersects_bbox`` is called with ``filled`` set to ``True`` +(the default value), there is no change in behavior. For those rare cases where +``Path.intersects_bbox`` was called with ``filled`` set to ``False`` and where +the old behavior is actually desired, the suggested workaround is to call +``Path.intersects_path`` with a rectangle as the path:: + + from matplotlib.path import Path + from matplotlib.transforms import Bbox, BboxTransformTo + rect = Path.unit_rectangle().transformed(BboxTransformTo(bbox)) + result = path.intersects_path(rect, filled=False) diff --git a/doc/api/artist_api.rst b/doc/api/artist_api.rst index 3e1bb8fbb9e9..da1839b0636d 100644 --- a/doc/api/artist_api.rst +++ b/doc/api/artist_api.rst @@ -16,6 +16,7 @@ ``Artist`` class ================ +.. autoclass:: Artist Interactive ----------- diff --git a/doc/conf.py b/doc/conf.py index 36f0d25f8f38..989f1f946a5d 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -14,6 +14,7 @@ import os import sys import sphinx +import six # If your extensions are in another directory, add it here. If the directory # is relative to the documentation root, use os.path.abspath to make it @@ -73,6 +74,16 @@ raise ImportError("No module named Image - you need to install " "pillow to build the documentation") +if six.PY2: + from distutils.spawn import find_executable + has_dot = find_executable('dot') is not None +else: + from shutil import which # Python >= 3.3 + has_dot = which('dot') is not None +if not has_dot: + raise OSError( + "No binary named dot - you need to install the Graph Visualization " + "software (usually packaged as 'graphviz') to build the documentation") try: import matplotlib diff --git a/doc/devel/coding_guide.rst b/doc/devel/coding_guide.rst index 121074da9f4f..3065bffe87fe 100644 --- a/doc/devel/coding_guide.rst +++ b/doc/devel/coding_guide.rst @@ -35,9 +35,6 @@ Documentation * See :ref:`documenting-matplotlib` for our documentation style guide. -* If your changes are non-trivial, please make an entry in the - :file:`CHANGELOG`. - * If your change is a major new feature, add an entry to :file:`doc/users/whats_new.rst`. @@ -82,7 +79,6 @@ PR Review guidelines merge the PR and then open a new PR against upstream. - Backports ========= diff --git a/doc/devel/documenting_mpl.rst b/doc/devel/documenting_mpl.rst index c2cd95aef458..ac21ed741153 100644 --- a/doc/devel/documenting_mpl.rst +++ b/doc/devel/documenting_mpl.rst @@ -8,7 +8,7 @@ Getting started =============== The documentation for matplotlib is generated from ReStructured Text using the -Sphinx_ documentation generation tool. Sphinx-1.0 or later and numpydoc 0.4 or +Sphinx_ documentation generation tool. Sphinx-1.3 or later and numpydoc 0.4 or later is required. The documentation sources are found in the :file:`doc/` directory in diff --git a/doc/make.py b/doc/make.py index 27dd1b7719a0..86aae03e8ba6 100755 --- a/doc/make.py +++ b/doc/make.py @@ -40,12 +40,16 @@ def check_build(): def doctest(): """Execute Sphinx 'doctest' target. """ - os.system('sphinx-build -b doctest -d build/doctrees . build/doctest') + subprocess.call( + [sys.executable] + + '-msphinx -b doctest -d build/doctrees . build/doctest'.split()) def linkcheck(): """Execute Sphinx 'linkcheck' target. """ - os.system('sphinx-build -b linkcheck -d build/doctrees . build/linkcheck') + subprocess.call( + [sys.executable] + + '-msphinx -b linkcheck -d build/doctrees . build/linkcheck'.split()) # For generating PNGs of the top row of index.html: @@ -81,7 +85,8 @@ def generate_frontpage_pngs(only_if_needed=True): continue # do nothing if png is newer # Execute python as subprocess (preferred over os.system()): - subprocess.check_call(["python", pn_py]) # raises CalledProcessError() + subprocess.check_call( + [sys.executable, pn_py]) # raises CalledProcessError() os.rename(fn_png, pn_png) # move file to _static/ directory @@ -96,22 +101,22 @@ def html(buildername='html'): rc = default_rc copy_if_out_of_date(rc, '_static/matplotlibrc') + options = ['-j{}'.format(n_proc), + '-b{}'.format(buildername), + '-dbuild/doctrees'] if small_docs: - options = "-D plot_formats=png:100" - else: - options = '' + options += ['-Dplot_formats=png:100'] if warnings_as_errors: - options = options + ' -W' - if os.system('sphinx-build -j %d %s -b %s -d build/doctrees . build/%s' % ( - n_proc, options, buildername, buildername)): + options += ['-W'] + if subprocess.call( + [sys.executable, '-msphinx', '.', 'build/{}'.format(buildername)] + + options): raise SystemExit("Building HTML failed.") # Clean out PDF files from the _images directory for filename in glob.glob('build/%s/_images/*.pdf' % buildername): os.remove(filename) - shutil.copy('../CHANGELOG', 'build/%s/_static/CHANGELOG' % buildername) - def htmlhelp(): """Build Sphinx 'htmlhelp' target. """ @@ -132,7 +137,9 @@ def latex(): # figs() if sys.platform != 'win32': # LaTeX format. - if os.system('sphinx-build -b latex -d build/doctrees . build/latex'): + if subprocess.call( + [sys.executable] + + '-msphinx -b latex -d build/doctrees . build/latex'.split()): raise SystemExit("Building LaTeX failed.") # Produce pdf. @@ -153,8 +160,9 @@ def texinfo(): # figs() if sys.platform != 'win32': # Texinfo format. - if os.system( - 'sphinx-build -b texinfo -d build/doctrees . build/texinfo'): + if subprocess.call( + [sys.executable] + + '-msphinx -b texinfo -d build/doctrees . build/texinfo'.split()): raise SystemExit("Building Texinfo failed.") # Produce info file. diff --git a/doc/users/artists.rst b/doc/users/artists.rst index aad279213392..b6f600b572cf 100644 --- a/doc/users/artists.rst +++ b/doc/users/artists.rst @@ -17,7 +17,7 @@ talking to user interface toolkits like `wxPython `_ or drawing languages like PostScript®, and the ``Artist`` handles all the high level constructs like representing and laying out the figure, text, and lines. The typical user will -spend 95% of his time working with the ``Artists``. +spend 95% of their time working with the ``Artists``. There are two types of ``Artists``: primitives and containers. The primitives represent the standard graphical objects we want to paint onto our canvas: diff --git a/doc/users/dflt_style_changes.rst b/doc/users/dflt_style_changes.rst index 08ffea240aef..ce4182e6d05e 100644 --- a/doc/users/dflt_style_changes.rst +++ b/doc/users/dflt_style_changes.rst @@ -18,6 +18,7 @@ values is a single line of python See :ref:`customizing-with-matplotlibrc-files` for details about how to persistently and selectively revert many of these changes. + .. contents:: Table of Contents :depth: 2 :local: diff --git a/CHANGELOG b/doc/users/prev_whats_new/changelog.rst similarity index 96% rename from CHANGELOG rename to doc/users/prev_whats_new/changelog.rst index ce177318dce1..a9f10a60c70a 100644 --- a/CHANGELOG +++ b/doc/users/prev_whats_new/changelog.rst @@ -1,3 +1,11 @@ +.. _old_changelog: + +List of changes to Matplotlib prior to 2015 +=========================================== + +This is a list of the changes made to Matplotlib from 2003 to 2015. For more +recent changes, please refer to the `what's new <../whats_new.html>`_ or +the `API changes <../../api/api_changes.html>`_. 2015-11-16 Levels passed to contour(f) and tricontour(f) must be in increasing order. @@ -186,6 +194,7 @@ - _axes.py contains the Axes class. This class now inherits from _AxesBase: it contains all "plotting" methods and labelling methods. + This refactoring should not affect the API. Only private methods are not importable from the axes module anymore. @@ -668,36 +677,35 @@ list, and changed its API to return axes as a numpy object array (with control of dimensions via squeeze keyword). FP. -2010-03-13 Manually brought in commits from branch - - ------------------------------------------------------------------------ - r8191 | leejjoon | 2010-03-13 17:27:57 -0500 (Sat, 13 Mar 2010) | 1 line +2010-03-13 Manually brought in commits from branch:: + + ------------------------------------------------------------------------ + r8191 | leejjoon | 2010-03-13 17:27:57 -0500 (Sat, 13 Mar 2010) | 1 line fix the bug that handles for scatter are incorrectly set when dpi!=72. Thanks to Ray Speth for the bug report. -2010-03-03 Manually brought in commits from branch via diff/patch - (svnmerge is broken) +2010-03-03 Manually brought in commits from branch via diff/patch (svnmerge is broken):: - ------------------------------------------------------------------------ - r8175 | leejjoon | 2010-03-03 10:03:30 -0800 (Wed, 03 Mar 2010) | 1 line + ------------------------------------------------------------------------ + r8175 | leejjoon | 2010-03-03 10:03:30 -0800 (Wed, 03 Mar 2010) | 1 line - fix arguments of allow_rasterization.draw_wrapper - ------------------------------------------------------------------------ - r8174 | jdh2358 | 2010-03-03 09:15:58 -0800 (Wed, 03 Mar 2010) | 1 line + fix arguments of allow_rasterization.draw_wrapper + ------------------------------------------------------------------------ + r8174 | jdh2358 | 2010-03-03 09:15:58 -0800 (Wed, 03 Mar 2010) | 1 line - added support for favicon in docs build - ------------------------------------------------------------------------ - r8173 | jdh2358 | 2010-03-03 08:56:16 -0800 (Wed, 03 Mar 2010) | 1 line + added support for favicon in docs build + ------------------------------------------------------------------------ + r8173 | jdh2358 | 2010-03-03 08:56:16 -0800 (Wed, 03 Mar 2010) | 1 line - applied Mattias get_bounds patch - ------------------------------------------------------------------------ - r8172 | jdh2358 | 2010-03-03 08:31:42 -0800 (Wed, 03 Mar 2010) | 1 line + applied Mattias get_bounds patch + ------------------------------------------------------------------------ + r8172 | jdh2358 | 2010-03-03 08:31:42 -0800 (Wed, 03 Mar 2010) | 1 line - fix svnmerge download instructions - ------------------------------------------------------------------------ - r8171 | jdh2358 | 2010-03-03 07:47:48 -0800 (Wed, 03 Mar 2010) | 1 line + fix svnmerge download instructions + ------------------------------------------------------------------------ + r8171 | jdh2358 | 2010-03-03 07:47:48 -0800 (Wed, 03 Mar 2010) | 1 line @@ -833,6 +841,7 @@ filename extension used by savefig. - JKS =============================================== + 2009-09-21 Tagged for release 0.99.1 2009-09-20 Fix usetex spacing errors in pdf backend. - JKS @@ -1096,7 +1105,7 @@ macosx collections; speedups can be 20x. Also fixes some bugs in which gc got into inconsistent state -====================================================================== +----------------------- 2008-05-17 Release 0.98.5.3 at r7107 from the branch - JDH @@ -1352,7 +1361,8 @@ 2008-12-18 add new arrow style, a line + filled triangles. -JJL -================================================================== +---------------- + 2008-12-18 Re-Released 0.98.5.2 from v0_98_5_maint at r6679 Released 0.98.5.2 from v0_98_5_maint at r6667 @@ -1382,7 +1392,7 @@ support symlinks, these become copies, and the font files are large, so the distro becomes unneccessarily bloaded. Keeping the mpl_examples dir because relative links are - harder for the plot directive and the *.py files are not so + harder for the plot directive and the \*.py files are not so large. - JDH 2008-12-15 Fix \$ in non-math text with usetex off. Document @@ -1415,7 +1425,8 @@ 2008-12-12 Added support to asign labels to histograms of multiple data. - MM -================================================================= +------------------------- + 2008-12-11 Released 0.98.5 at svn r6573 2008-12-11 Use subprocess.Popen instead of os.popen in dviread @@ -1424,7 +1435,8 @@ 2008-12-10 Added Michael's font_manager fix and Jae-Joon's figure/subplot fix. Bumped version number to 0.98.5 - JDH -================================================================= +---------------------------- + 2008-12-09 Released 0.98.4 at svn r6536 2008-12-08 Added mdehoon's native macosx backend from sf patch 2179017 - JDH @@ -1621,9 +1633,10 @@ (which does not handle NaNs or infs) will be turned off automatically when infs or NaNs are present. Also masked arrays are now converted to arrays with NaNs for consistent handling of masks and NaNs - - MGD and EF + - MGD and EF + +------------------------ -================================================================= 2008-08-03 Released 0.98.3 at svn r5947 2008-08-01 Backported memory leak fixes in _ttconv.cpp - MGD @@ -1726,7 +1739,8 @@ 2008-06-25 Fix rendering quality of pcolor - MGD -================================================================= +---------------------------- + 2008-06-24 Released 0.98.2 at svn r5667 - (source only for debian) JDH 2008-06-24 Added "transparent" kwarg to savefig. - MGD @@ -1736,7 +1750,8 @@ 2008-06-23 Use splines to render circles in scatter plots - MGD -=============================================================== +---------------------------- + 2008-06-22 Released 0.98.1 at revision 5637 2008-06-22 Removed axes3d support and replaced it with a @@ -1824,7 +1839,8 @@ 2008-06-02 Added support for log to hist with histtype='step' and fixed a bug for log-scale stacked histograms - MM -=============================================================== +----------------------------- + 2008-05-29 Released 0.98.0 at revision 5314 2008-05-29 matplotlib.image.imread now no longer always returns RGBA @@ -1835,8 +1851,8 @@ 2008-05-29 Implement path clipping in PS backend - JDH 2008-05-29 Fixed two bugs in texmanager.py: - improved comparison of dvipng versions - fixed a bug introduced when get_grey method was added + improved comparison of dvipng versions + fixed a bug introduced when get_grey method was added - DSD 2008-05-28 Fix crashing of PDFs in xpdf and ghostscript when two-byte @@ -2075,7 +2091,8 @@ 2008-01-10 Use setup.cfg to set the default parameters (tkagg, numpy) when building windows installers - DSD -=============================================================== +-------------------- + 2008-01-06 Released 0.91.2 at revision 4802 2007-12-26 Reduce too-late use of matplotlib.use() to a warning @@ -2121,10 +2138,12 @@ 2007-12-04 Support '|' as a character in mathtext - MGD -=============================================================== +----------------------------------------------------- + 2007-11-27 Released 0.91.1 at revision 4517 -=============================================================== +----------------------------------------------------- + 2007-11-27 Released 0.91.0 at revision 4478 2007-11-13 All backends now support writing to a file-like object, not @@ -2265,10 +2284,10 @@ - Sharing an axis across figures is now done in exactly the same way as sharing an axis between two axes in the - same figure: + same figure:: - fig1 = figure() - fig2 = figure() + fig1 = figure() + fig2 = figure() ax1 = fig1.add_subplot(111) ax2 = fig2.add_subplot(111, sharex=ax1, sharey=ax1) @@ -2586,7 +2605,8 @@ 2007-06-03 Turned mathtext in SVG into single with multiple objects (easier to edit in inkscape). - NN -=============================================================== +---------------------------- + 2007-06-02 Released 0.90.1 at revision 3352 2007-06-02 Display only meaningful labels when calling legend() @@ -2770,7 +2790,8 @@ references to text()/latin1(), plus some improvements to the toolbar layout - DSD -=============================================================== +--------------------------- + 2007-02-06 Released 0.90.0 at revision 3003 2007-01-22 Extended the new picker API to text, patches and patch @@ -2936,7 +2957,8 @@ http://sourceforge.net/tracker/index.php?func=detail&aid=1587359&group_id=80706&atid=560722 JDH -=============================================================== +------------------------- + 2006-10-26 Released 0.87.7 at revision 2835 2006-10-25 Made "tiny" kwarg in Locator.nonsingular much smaller - EF @@ -2998,7 +3020,8 @@ 2006-09-29 setup.py: check for required pygtk versions, fixes bug #1460783 - SC -=============================================================== +--------------------------------- + 2006-09-27 Released 0.87.6 at revision 2783 2006-09-24 Added line pointers to the Annotation code, and a pylab @@ -3017,7 +3040,8 @@ yet whether inheriting from TextWithDash is the right base class or if another approach is needed - JDH -=============================================================== +------------------------------ + 2006-09-05 Released 0.87.5 at revision 2761 2006-09-04 Added nxutils for some numeric add-on extension code -- @@ -3137,7 +3161,8 @@ 2006-07-12 Add support to render the scientific notation label over the right-side y-axis - DSD -=============================================================== +------------------------------ + 2006-07-11 Released 0.87.4 at revision 2558 2006-07-07 Fixed a usetex bug with older versions of latex - DSD @@ -3229,7 +3254,8 @@ 2006-06-08 Minor bug fix to make ticker.py draw proper minus signs with usetex - DSD -=============================================================== +----------------------- + 2006-06-06 Released 0.87.3 at revision 2432 2006-05-30 More partial support for polygons with outline or fill, @@ -3362,7 +3388,7 @@ 2006-03-21 Added Rob Knight's arrow code; see examples/arrow_demo.py - JDH 2006-03-20 Added support for masking values with nan's, using ADS's - isnan module and the new API. Works for *Agg backends - DSD + isnan module and the new API. Works for \*Agg backends - DSD 2006-03-20 Added contour.negative_linestyle rcParam - ADS @@ -3401,7 +3427,8 @@ 2006-03-16 Added John Porter's 3D handling code -=============================================================== +------------------------ + 2006-03-16 Released 0.87.2 at revision 2150 2006-03-15 Fixed bug in MaxNLocator revealed by daigos@infinito.it. @@ -3444,7 +3471,8 @@ Supported page sizes include letter, legal, ledger, A0-A10, and B0-B10 - DSD -=============================================================== +------------------------------------ + 2006-03-07 Released 0.87.1 2006-03-04 backend_cairo.py: @@ -3489,7 +3517,8 @@ Ray Jones, and fixed incorrect fix found by Jeff Whitaker - EF -=============================================================== +-------------------------------- + 2006-02-22 Released 0.87 2006-02-21 Fixed portrait/landscape orientation in postscript backend - DSD @@ -3544,7 +3573,7 @@ 2006-01-29 Fixed tex's caching to include font.family rc information - DSD -2006-01-29 Fixed subpixel rendering bug in *Agg that was causing +2006-01-29 Fixed subpixel rendering bug in \*Agg that was causing uneven gridlines - JDH 2006-01-28 Added fontcmd to backend_ps's RendererPS.draw_tex, to support other @@ -3577,7 +3606,8 @@ 2006-01-24 Fixed some bugs in usetex's and ps.usedistiller's dependency checking - DSD -=============================================================== +------------------------------- + 2006-01-24 Released 0.86.2 2006-01-20 Added a converters dict to pylab load to convert selected @@ -3588,7 +3618,7 @@ or sequence of strings to a matplotlib datenum 2006-01-18 Added quadrilateral pcolormesh patch 1409190 by Alex Mont - and Paul Kienzle -- this is *Agg only for now. See + and Paul Kienzle -- this is \*Agg only for now. See examples/quadmesh_demo.py - JDH 2006-01-18 Added Jouni's boxplot patch - JDH @@ -3600,7 +3630,8 @@ 2006-1-12 Fixed numpy / numeric to use .dtype.char to keep in SYNC with numpy SVN -=============================================================== +--------------------------- + 2006-1-11 Released 0.86.1 2006-1-11 Fixed setup.py for win32 build and added rc template to the MANIFEST.in @@ -3615,7 +3646,8 @@ 2006-1-10 Added checks for usetex dependencies. - DSD -======================================================================= +--------------------------------- + 2006-1-9 Released 0.86 2006-1-4 Changed to support numpy (new name for scipy_core) - TEO @@ -3626,6 +3658,7 @@ 2005-12-27 Altered numerix/scipy to support new scipy package structure - TEO + 2005-12-20 Fixed Jame's Boyles date tick reversal problem - JDH 2005-12-20 Added Jouni's rc patch to support lists of keys to set on - @@ -3694,7 +3727,8 @@ 2005-11-25 Changed text.py to ensure color is hashable. EF -======================================================================= +-------------------------------- + 2005-11-16 Released 0.85 2005-11-16 Changed the default default linewidth in rc to 1.0 @@ -3756,7 +3790,8 @@ colorbar will follow suit. Fixed a bug introduced in 0.84, in which contourf(...,colors=...) was broken - EF -======================================================================= +------------------------------- + 2005-09-19 Released 0.84 2005-09-14 Added a new 'resize_event' which triggers a callback with a @@ -3834,7 +3869,7 @@ to a separate png file, fixes bug #1245306 (thanks to Norbert Nemec for the patch) - SC -======================================================================= +--------------------------- 2005-07-29 Released 0.83.2 @@ -3843,6 +3878,7 @@ 2005-07-27 Applied sf patch 1244732: Scale axis such that circle looks like circle - JDH + 2005-07-29 Improved message reporting in texmanager and backend_ps - DSD 2005-07-28 backend_gtk.py: update FigureCanvasGTK.draw() (needed due to the @@ -3967,7 +4003,7 @@ 2005-06-16 Applied David Cooke's subplot make_key patch -======================================================== +---------------------------------- 2005-06-15 0.82 released @@ -3982,7 +4018,7 @@ 2005-06-14 Wrote some GUI neutral widgets (Button, Slider, RadioButtons, CheckButtons) in matplotlib.widgets. See - examples/widgets/*.py - JDH + examples/widgets/\*.py - JDH 2005-06-14 Exposed subplot parameters as rc vars and as the fig SubplotParams instance subplotpars. See @@ -4018,7 +4054,7 @@ - DSD -===================================================================== +---------------------- 2005-06-07 matplotlib-0.81 released @@ -4169,7 +4205,8 @@ 2005-04-13 Applied Tim Leslie's arrow key event handling patch - JDH -================================================================= +--------------------------- + 0.80 released 2005-04-11 Applied a variant of rick's xlim/ylim/axis patch. These @@ -4194,7 +4231,7 @@ 2005-04-01 Added editable polygon example -========================================================================== +------------------------------ 2005-03-31 0.74 released @@ -4220,7 +4257,7 @@ 2005-03-27 Added sprint legend patch plus John Gill's tests and fix -- see examples/legend_auto.py - JDH -========================================================================== +--------------------------- 2005-03-19 0.73.1 released @@ -4228,7 +4265,8 @@ 2005-03-18 Add .number attribute to figure objects returned by figure() - FP -=========================================================================== +--------------------------- + 2005-03-18 0.73 released 2005-03-16 Fixed labelsep bug @@ -4241,22 +4279,22 @@ 2005-03-15 backend_gtkagg.py: changed to use double buffering, this fixes the problem reported Joachim Berdal Haga - "Parts of plot lagging - from previous frame in animation". Tested with anim.py and it makes + from previous frame in animation". Tested with anim.py and it makes no noticable difference to performance (23.7 before, 23.6 after) - - SC + - SC 2005-03-14 add src/_backend_gdk.c extension to provide a substitute function - for pixbuf.get_pixels_array(). Currently pixbuf.get_pixels_array() + for pixbuf.get_pixels_array(). Currently pixbuf.get_pixels_array() only works with Numeric, and then only works if pygtk has been - compiled with Numeric support. The change provides a function - pixbuf_get_pixels_array() which works with Numeric and numarray and - is always available. It means that backend_gtk should be able to - display images and mathtext in all circumstances. - SC + compiled with Numeric support. The change provides a function + pixbuf_get_pixels_array() which works with Numeric and numarray and + is always available. It means that backend_gtk should be able to + display images and mathtext in all circumstances. - SC 2005-03-11 Upgraded CXX to 5.3.1 2005-03-10 remove GraphicsContextPS.set_linestyle() - and GraphicsContextSVG.set_linestyle() since they do no more than + and GraphicsContextSVG.set_linestyle() since they do no more than the base class GraphicsContext.set_linestyle() - SC 2005-03-09 Refactored contour functionality into dedicated module @@ -4296,7 +4334,7 @@ 2005-02-24 colors.py change ColorConverter.to_rgb() so it always returns rgb (and not rgba), allow cnames keys to be cached, change the exception raised from RuntimeError to ValueError (like hex2color()) - hex2color() use a regular expression to check the color string is + hex2color() use a regular expression to check the color string is valid - SC @@ -4312,7 +4350,8 @@ drawing routines for greater flexibility - JDH -=========================================================== +-------------------------------- + 2005-02-22 0.72.1 released 2005-02-21 fixed linestyles for collections -- contour now dashes for @@ -4330,7 +4369,7 @@ 2005-02-14 Added enthought traits to matplotlib tree - JDH -=========================================================== +------------------------ 2005-02-14 0.72 released @@ -4411,7 +4450,7 @@ 2005-01-24 Fixed contour to work w/ interactive changes in colormaps, clim, etc - JDH -=============================================================== +----------------------------- 2005-01-21 matplotlib-0.71 released @@ -4456,7 +4495,7 @@ 2005-01-15 backend_cairo: added PDF support which requires pycairo 0.1.4. Its not usable yet, but is ready for when the Cairo PDF backend - matures - SC + matures - SC 2005-01-15 Added Nadia's x,y contour fix @@ -4477,7 +4516,8 @@ 2005-01-06 Add patch from Ben Vanhaeren to make the FigureManagerGTK vbox a public attribute - SC -==================================================================== +---------------------------- + 2004-12-30 Release 0.70 2004-12-28 Added coord location to key press and added a @@ -4506,7 +4546,7 @@ to explain and demonstrate how text rotations and alignment work in matplotlib. - JDH -====================================================================== +----------------------- 2004-12-22 0.65.1 released - JDH @@ -4548,7 +4588,7 @@ 2004-12-13 dates.py: removed all timezone() calls, except for UTC - SC -====================================================================== +---------------------------- 2004-12-13 0.65 released - JDH @@ -4587,16 +4627,16 @@ - backend_gdk.py - an image backend - backend_gtk.py - A GUI backend that uses GDK - SC -2004-12-08 backend_gtk.py: remove quit_after_print_xvfb(*args), show_xvfb(), - Dialog_MeasureTool(gtk.Dialog) one month after sending mail to +2004-12-08 backend_gtk.py: remove quit_after_print_xvfb(\*args), show_xvfb(), + Dialog_MeasureTool(gtk.Dialog) one month after sending mail to matplotlib-users asking if anyone still uses these functions - SC 2004-12-02 backend_bases.py, backend_template.py: updated some of the method documentation to make them consistent with each other - SC 2004-12-04 Fixed multiple bindings per event for TkAgg mpl_connect and - mpl_disconnect. Added a "test_disconnect" command line - parameter to coords_demo.py JTM + mpl_disconnect. Added a "test_disconnect" command line + parameter to coords_demo.py JTM 2004-12-04 Fixed some legend bugs JDH @@ -4610,7 +4650,7 @@ 2004-11-29 Added the over command to the matlab interface. over allows you to add an overlay plot regardless of hold - state. - JDH + state. - JDH 2004-11-25 Added Printf to mplutils for printf style format string formatting in C++ (should help write better exceptions) @@ -4636,13 +4676,13 @@ Cairo and get saved using backend_gtk.print_figure() - SC 2004-11-13 backend_cairo.py: Discovered the magic number (96) required for - Cairo PS plots to come out the right size. Restored Cairo PS output - and added support for landscape mode - SC + Cairo PS plots to come out the right size. Restored Cairo PS output + and added support for landscape mode - SC 2004-11-13 Added ishold - JDH 2004-11-12 Added many new matlab colormaps - autumn bone cool copper - flag gray hot hsv jet pink prism spring summer winter - PG + flag gray hot hsv jet pink prism spring summer winter - PG 2004-11-11 greatly simplify the emitted postscript code - JV @@ -4658,12 +4698,13 @@ py2exe (or similar) - is used by backend_gtk.py - SC 2004-11-09 backend_gtk.py: Made fix suggested by maffew@cat.org.au - to prevent problems when py2exe calls pygtk.require(). - SC + to prevent problems when py2exe calls pygtk.require(). - SC 2004-11-09 backend_cairo.py: Added support for printing to a fileobject. Disabled cairo PS output which is not working correctly. - SC -============================================================== +---------------------------------- + 2004-11-08 matplotlib-0.64 released 2004-11-04 Changed -dbackend processing to only use known backends, so @@ -4708,7 +4749,7 @@ draw_image() and clipping. gtkcairo works reasonably well. cairo does not yet create any files since I can't figure how to set the 'target surface', I don't think pycairo wraps the required functions - - SC + - SC 2004-10-28 backend_gtk.py: Improved the save dialog (GTK 2.4 only) so it presents the user with a menu of supported image formats - SC @@ -4757,7 +4798,7 @@ 2004-09-29 Added a Verbose class for reporting - JDH -============================================================== +------------------------------------ 2004-09-28 Released 0.63.0 @@ -4798,25 +4839,26 @@ backend maintenance. Added his numutils to mlab. JDH 2004-09-16 Re-designated all files in matplotlib/images as binary and - w/o keyword substitution using "cvs admin -kb *.svg ...". - See binary files in "info cvs" under Linux. This was messing - up builds from CVS on windows since CVS was doing lf -> cr/lf - and keyword substitution on the bitmaps. - JTM + w/o keyword substitution using "cvs admin -kb \*.svg ...". + See binary files in "info cvs" under Linux. This was messing + up builds from CVS on windows since CVS was doing lf -> cr/lf + and keyword substitution on the bitmaps. - JTM 2004-09-15 Modified setup to build array-package-specific extensions - for those extensions which are array-aware. Setup builds - extensions automatically for either Numeric, numarray, or - both, depending on what you have installed. Python proxy - modules for the array-aware extensions import the version - optimized for numarray or Numeric determined by numerix. + for those extensions which are array-aware. Setup builds + extensions automatically for either Numeric, numarray, or + both, depending on what you have installed. Python proxy + modules for the array-aware extensions import the version + optimized for numarray or Numeric determined by numerix. - JTM 2004-09-15 Moved definitions of infinity from mlab to numerix to avoid - divide by zero warnings for numarray - JTM + divide by zero warnings for numarray - JTM 2004-09-09 Added axhline, axvline, axhspan and axvspan -============================================================== +------------------------------- + 2004-08-30 matplotlib 0.62.4 released 2004-08-30 Fixed a multiple images with different extent bug, @@ -4850,7 +4892,8 @@ 2004-08-11 Added Gregory's fltkagg backend -========================================================================== +------------------------------ + 2004-08-09 matplotlib-0.61.0 released 2004-08-08 backend_gtk.py: get rid of the final PyGTK deprecation warning by @@ -4919,7 +4962,7 @@ 2004-07-20 Added new icons for toolbar2 - JDH -2004-07-19 Added vertical mathtext for *Agg and GTK - thanks Jim +2004-07-19 Added vertical mathtext for \*Agg and GTK - thanks Jim Benson! - JDH 2004-07-16 Added ps/eps/svg savefig options to wx and gtk JDH @@ -4956,7 +4999,7 @@ 2004-07-09 added default arg None to matplotlib.matlab grid command to toggle current grid state -============================ +--------------------- 2004-07-08 0.60.2 released @@ -4964,7 +5007,7 @@ 2004-07-08 added some numarray bug workarounds -======= +-------------------------- 2004-07-07 0.60 released @@ -5044,6 +5087,7 @@ --------------------------------------------------------------- + 2004-06-09 0.54.2 released 2004-06-08 Rewrote ft2font using CXX as part of general memory leak @@ -5079,6 +5123,7 @@ propertly support clim - JDH ----------------------------------------------------------------- + 2004-05-27 0.54.1 released 2004-05-27 Lots of small bug fixes: rotated text at negative angles, @@ -5094,6 +5139,7 @@ in 2 draws per figure mangager show(). - JTM ------------------------------------------------------------ + 2004-05-19 0.54 released 2004-05-18 Added newline seperated text with rotations to text.Text @@ -5103,14 +5149,14 @@ 2004-05-14 Added fast polygon collections - changed scatter to use them. Added multiple symbols to scatter. 10x speedup on - large scatters using *Agg and 5X speedup for ps. - JDH + large scatters using \*Agg and 5X speedup for ps. - JDH 2004-05-14 On second thought... created an "nx" namespace in - in numerix which maps type names onto typecodes - the same way for both numarray and Numeric. This - undoes my previous change immediately below. To get a - typename for Int16 useable in a Numeric extension: - say nx.Int16. - JTM + in numerix which maps type names onto typecodes + the same way for both numarray and Numeric. This + undoes my previous change immediately below. To get a + typename for Int16 useable in a Numeric extension: + say nx.Int16. - JTM 2004-05-15 Rewrote transformation class in extension code, simplified all the artist constructors - JDH @@ -5147,7 +5193,7 @@ 2004-05-03 Removed the close buttons on all GUIs and added the python #! bang line to the examples following Steve Chaplin's - advice on matplotlib dev + advice on matplotlib dev 2004-04-29 Added CXX and rewrote backend_agg using it; tracked down and fixed agg memory leak - JDH @@ -5165,6 +5211,7 @@ and pcolor(). Deleted duplicate pcolor(). - JTM ------------------------------------------------------------ + 2004-04-21 matplotlib 0.53 release 2004-04-19 Fixed vertical alignment bug in PS backend - JDH @@ -5198,18 +5245,18 @@ 2004-04-08 Fixed viewlim set problem on axes and axis. - JDH 2004-04-07 Added validate_comma_sep_str and font properties paramaters to - __init__. Removed font families and added rcParams to - FontProperties __init__ arguments in font_manager. Added - default font property parameters to .matplotlibrc file with - descriptions. Added deprecation warnings to the get_- and - set_fontXXX methods of the Text object. - PEB + __init__. Removed font families and added rcParams to + FontProperties __init__ arguments in font_manager. Added + default font property parameters to .matplotlibrc file with + descriptions. Added deprecation warnings to the get\_ - and + set_fontXXX methods of the Text object. - PEB 2004-04-06 Added load and save commands for ASCII data - JDH 2004-04-05 Improved font caching by not reading AFM fonts until needed. - Added better documentation. Changed the behaviour of the + Added better documentation. Changed the behaviour of the get_family, set_family, and set_name methods of FontProperties. - - PEB + - PEB 2004-04-05 Added WXAgg backend - JDH @@ -5219,14 +5266,8 @@ 2004-03-29 Fixed fontdicts and kwargs to work with new font manager - JDH - - - - - - - -------------------------------------------- + This is the Old, stale, never used changelog 2002-12-10 - Added a TODO file and CHANGELOG. Lots to do -- get @@ -5272,12 +5313,12 @@ This is the Old, stale, never used changelog 2003-04-25 Implemented new functions errorbar, scatter and hist Added a new line type '|' which is a vline. syntax is - plot(x, Y, '|') where y.shape = len(x),2 and each row gives - the ymin,ymax for the respective values of x. Previously I - had implemented vlines as a list of lines, but I needed the - efficientcy of the numeric clipping for large numbers of - vlines outside the viewport, so I wrote a dedicated class - Vline2D which derives from Line2D + plot(x, Y, '|') where y.shape = len(x),2 and each row gives + the ymin,ymax for the respective values of x. Previously I + had implemented vlines as a list of lines, but I needed the + efficientcy of the numeric clipping for large numbers of + vlines outside the viewport, so I wrote a dedicated class + Vline2D which derives from Line2D 2003-05-01 @@ -5363,6 +5404,7 @@ This is the Old, stale, never used changelog 2003-11-10 - 2003-11-11 - major refactoring. + * Ticks (with labels, lines and grid) handled by dedicated class * Artist now know bounding box and dpi * Bounding boxes and transforms handled by dedicated classes diff --git a/doc/users/pyplot_tutorial.rst b/doc/users/pyplot_tutorial.rst index 96d31dafaf7e..77ba9384d7d5 100644 --- a/doc/users/pyplot_tutorial.rst +++ b/doc/users/pyplot_tutorial.rst @@ -288,7 +288,7 @@ details. More examples can be found in :ref:`pylab_examples-annotation_demo`. -Logarithmic and other nonlinear axis +Logarithmic and other nonlinear axes ==================================== :mod:`matplotlib.pyplot` supports not only linear axis scales, but also diff --git a/doc/users/screenshots.rst b/doc/users/screenshots.rst index 7bf30859f87e..1e7b4dbed6be 100644 --- a/doc/users/screenshots.rst +++ b/doc/users/screenshots.rst @@ -43,7 +43,7 @@ Path demo You can add arbitrary paths in matplotlib using the :mod:`matplotlib.path` module: -.. plot:: mpl_examples/shapes_and_collections/path_patch_demo.py +.. plot:: mpl_examples/shapes_and_collections/plot_path_patch.py .. _screenshots_mplot3d_surface: diff --git a/doc/users/whats_new.rst b/doc/users/whats_new.rst index daef2a3d2fb9..078eef4e4912 100644 --- a/doc/users/whats_new.rst +++ b/doc/users/whats_new.rst @@ -336,3 +336,4 @@ Previous Whats New :maxdepth: 1 prev_whats_new/whats_new_* + prev_whats_new/changelog diff --git a/doc/users/whats_new/invalid_axes_limits_errors.rst b/doc/users/whats_new/invalid_axes_limits_errors.rst new file mode 100644 index 000000000000..6008e2359905 --- /dev/null +++ b/doc/users/whats_new/invalid_axes_limits_errors.rst @@ -0,0 +1,6 @@ +Invalid (Non-finite) Axis Limit Error +------------------------------------- + +When using :func:`set_xlim` and :func:`set_ylim`, passing non-finite values now +results in a ValueError. The previous behavior resulted in the limits being +erroneously reset to `(-0.001, 0.001)`. diff --git a/examples/api/power_norm_demo.py b/examples/api/power_norm_demo.py old mode 100755 new mode 100644 diff --git a/examples/event_handling/keypress_demo.py b/examples/event_handling/keypress_demo.py old mode 100755 new mode 100644 diff --git a/examples/event_handling/pick_event_demo.py b/examples/event_handling/pick_event_demo.py old mode 100755 new mode 100644 diff --git a/examples/event_handling/pipong.py b/examples/event_handling/pipong.py old mode 100755 new mode 100644 diff --git a/examples/event_handling/pong_gtk.py b/examples/event_handling/pong_gtk.py old mode 100755 new mode 100644 diff --git a/examples/lines_bars_and_markers/fill_demo.py b/examples/lines_bars_and_markers/fill_demo.py index daecb7923d47..120036516955 100644 --- a/examples/lines_bars_and_markers/fill_demo.py +++ b/examples/lines_bars_and_markers/fill_demo.py @@ -1,9 +1,15 @@ """ -================== -A simple Fill plot -================== +============== +Fill plot demo +============== -This example showcases the most basic fill plot a user can do with matplotlib. +First example showcases the most basic fill plot a user can do with matplotlib. + +Second example shows a few optional features: + + * Multiple curves with a single command. + * Setting the fill color. + * Setting the opacity (alpha value). """ import numpy as np import matplotlib.pyplot as plt @@ -15,4 +21,11 @@ ax.fill(x, y, zorder=10) ax.grid(True, zorder=5) + +x = np.linspace(0, 2 * np.pi, 500) +y1 = np.sin(x) +y2 = np.sin(3 * x) + +fig, ax = plt.subplots() +ax.fill(x, y1, 'b', x, y2, 'r', alpha=0.3) plt.show() diff --git a/examples/lines_bars_and_markers/fill_demo_features.py b/examples/lines_bars_and_markers/fill_demo_features.py deleted file mode 100644 index efff86d2b78f..000000000000 --- a/examples/lines_bars_and_markers/fill_demo_features.py +++ /dev/null @@ -1,21 +0,0 @@ -""" -======================== -A more complex fill demo -======================== - -In addition to the basic fill plot, this demo shows a few optional features: - - * Multiple curves with a single command. - * Setting the fill color. - * Setting the opacity (alpha value). -""" -import numpy as np -import matplotlib.pyplot as plt - -x = np.linspace(0, 2 * np.pi, 500) -y1 = np.sin(x) -y2 = np.sin(3 * x) - -fig, ax = plt.subplots() -ax.fill(x, y1, 'b', x, y2, 'r', alpha=0.3) -plt.show() diff --git a/examples/lines_bars_and_markers/multicolored_line.py b/examples/lines_bars_and_markers/multicolored_line.py new file mode 100644 index 000000000000..9be424ad281f --- /dev/null +++ b/examples/lines_bars_and_markers/multicolored_line.py @@ -0,0 +1,48 @@ +''' +================== +Multicolored lines +================== + +This example shows how to make a multi-colored line. In this example, the line +is colored based on its derivative. +''' + +import numpy as np +import matplotlib.pyplot as plt +from matplotlib.collections import LineCollection +from matplotlib.colors import ListedColormap, BoundaryNorm + +x = np.linspace(0, 3 * np.pi, 500) +y = np.sin(x) +dydx = np.cos(0.5 * (x[:-1] + x[1:])) # first derivative + +# Create a set of line segments so that we can color them individually +# This creates the points as a N x 1 x 2 array so that we can stack points +# together easily to get the segments. The segments array for line collection +# needs to be (numlines) x (points per line) x 2 (for x and y) +points = np.array([x, y]).T.reshape(-1, 1, 2) +segments = np.concatenate([points[:-1], points[1:]], axis=1) + +fig, axs = plt.subplots(2, 1, sharex=True, sharey=True) + +# Create a continuous norm to map from data points to colors +norm = plt.Normalize(dydx.min(), dydx.max()) +lc = LineCollection(segments, cmap='viridis', norm=norm) +# Set the values used for colormapping +lc.set_array(dydx) +lc.set_linewidth(2) +line = axs[0].add_collection(lc) +fig.colorbar(line, ax=axs[0]) + +# Use a boundary norm instead +cmap = ListedColormap(['r', 'g', 'b']) +norm = BoundaryNorm([-1, -0.5, 0.5, 1], cmap.N) +lc = LineCollection(segments, cmap=cmap, norm=norm) +lc.set_array(dydx) +lc.set_linewidth(2) +line = axs[1].add_collection(lc) +fig.colorbar(line, ax=axs[1]) + +axs[0].set_xlim(x.min(), x.max()) +axs[0].set_ylim(-1.1, 1.1) +plt.show() diff --git a/examples/misc/ftface_props.py b/examples/misc/ftface_props.py old mode 100755 new mode 100644 diff --git a/examples/mplot3d/2dcollections3d_demo.py b/examples/mplot3d/2dcollections3d_demo.py index 54bf1f39839b..436219ae8e93 100644 --- a/examples/mplot3d/2dcollections3d_demo.py +++ b/examples/mplot3d/2dcollections3d_demo.py @@ -1,7 +1,11 @@ -''' -Demonstrates using ax.plot's zdir keyword to plot 2D scatterplot data on +""" +======================= +Plot 2D data on 3D plot +======================= + +Demonstrates using ax.plot's zdir keyword to plot 2D data on selective axes of a 3D plot. -''' +""" from mpl_toolkits.mplot3d import Axes3D import numpy as np diff --git a/examples/mplot3d/bars3d_demo.py b/examples/mplot3d/bars3d_demo.py index 478a16abd89e..2cb2a5078b35 100644 --- a/examples/mplot3d/bars3d_demo.py +++ b/examples/mplot3d/bars3d_demo.py @@ -1,7 +1,11 @@ -''' +""" +======================================== +Create 2D bar graphs in different planes +======================================== + Demonstrates making a 3D plot which has 2D bar graphs projected onto planes y=0, y=1, etc. -''' +""" from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt diff --git a/examples/mplot3d/hist3d_demo.py b/examples/mplot3d/hist3d_demo.py index 839226a73716..603645b651e0 100644 --- a/examples/mplot3d/hist3d_demo.py +++ b/examples/mplot3d/hist3d_demo.py @@ -1,6 +1,10 @@ -''' +""" +============================== +Create 3D histogram of 2D data +============================== + Demo of a histogram for 2 dimensional data as a bar graph in 3D. -''' +""" from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt diff --git a/examples/mplot3d/pathpatch3d_demo.py b/examples/mplot3d/pathpatch3d_demo.py index 33d097494898..55d33dc94823 100644 --- a/examples/mplot3d/pathpatch3d_demo.py +++ b/examples/mplot3d/pathpatch3d_demo.py @@ -1,7 +1,12 @@ -''' +""" +============================ +Draw flat objects in 3D plot +============================ + Demonstrate using pathpatch_2d_to_3d to 'draw' shapes and text on a 3D plot. -''' +""" +import numpy as np import matplotlib.pyplot as plt from matplotlib.patches import Circle, PathPatch # register Axes3D class with matplotlib by importing Axes3D diff --git a/examples/mplot3d/polys3d_demo.py b/examples/mplot3d/polys3d_demo.py index 7e1687c0357b..a7c115785200 100644 --- a/examples/mplot3d/polys3d_demo.py +++ b/examples/mplot3d/polys3d_demo.py @@ -1,7 +1,12 @@ -''' -Demonstrate how to create semi-transparent polygons which fill the space -under a line graph, creating a sort of 'jagged stained glass' effect. -''' +""" +============================================= +Generate polygons to fill under 3D line graph +============================================= + +Demonstrate how to create polygons which fill the space under a line +graph. In this example polygons are semi-transparent, creating a sort +of 'jagged stained glass' effect. +""" from mpl_toolkits.mplot3d import Axes3D from matplotlib.collections import PolyCollection diff --git a/examples/pylab_examples/agg_buffer.py b/examples/pylab_examples/agg_buffer.py old mode 100755 new mode 100644 diff --git a/examples/pylab_examples/anscombe.py b/examples/pylab_examples/anscombe.py old mode 100755 new mode 100644 diff --git a/examples/pylab_examples/bar_stacked.py b/examples/pylab_examples/bar_stacked.py old mode 100755 new mode 100644 diff --git a/examples/pylab_examples/color_demo.py b/examples/pylab_examples/color_demo.py old mode 100755 new mode 100644 diff --git a/examples/pylab_examples/contour_demo.py b/examples/pylab_examples/contour_demo.py old mode 100755 new mode 100644 diff --git a/examples/pylab_examples/contour_image.py b/examples/pylab_examples/contour_image.py old mode 100755 new mode 100644 diff --git a/examples/pylab_examples/contourf_demo.py b/examples/pylab_examples/contourf_demo.py old mode 100755 new mode 100644 diff --git a/examples/pylab_examples/contourf_hatching.py b/examples/pylab_examples/contourf_hatching.py old mode 100755 new mode 100644 diff --git a/examples/pylab_examples/coords_demo.py b/examples/pylab_examples/coords_demo.py old mode 100755 new mode 100644 diff --git a/examples/pylab_examples/cursor_demo.py b/examples/pylab_examples/cursor_demo.py old mode 100755 new mode 100644 diff --git a/examples/pylab_examples/custom_ticker1.py b/examples/pylab_examples/custom_ticker1.py old mode 100755 new mode 100644 diff --git a/examples/pylab_examples/equal_aspect_ratio.py b/examples/pylab_examples/equal_aspect_ratio.py old mode 100755 new mode 100644 diff --git a/examples/pylab_examples/eventplot_demo.py b/examples/pylab_examples/eventplot_demo.py old mode 100755 new mode 100644 diff --git a/examples/pylab_examples/font_table_ttf.py b/examples/pylab_examples/font_table_ttf.py old mode 100755 new mode 100644 diff --git a/examples/pylab_examples/ganged_plots.py b/examples/pylab_examples/ganged_plots.py deleted file mode 100644 index 9d14a522c546..000000000000 --- a/examples/pylab_examples/ganged_plots.py +++ /dev/null @@ -1,45 +0,0 @@ -""" -To create plots that share a common axes (visually) you can set the -hspace between the subplots close to zero (do not use zero itself). -Normally you'll want to turn off the tick labels on all but one of the -axes. - -In this example the plots share a common xaxis but you can follow the -same logic to supply a common y axis. -""" -import matplotlib.pyplot as plt -import numpy as np - -t = np.arange(0.0, 2.0, 0.01) - -s1 = np.sin(2*np.pi*t) -s2 = np.exp(-t) -s3 = s1*s2 - -# axes rect in relative 0,1 coords left, bottom, width, height. Turn -# off xtick labels on all but the lower plot - - -f = plt.figure() -plt.subplots_adjust(hspace=0.001) - - -ax1 = plt.subplot(311) -ax1.plot(t, s1) -plt.yticks(np.arange(-0.9, 1.0, 0.4)) -plt.ylim(-1, 1) - -ax2 = plt.subplot(312, sharex=ax1) -ax2.plot(t, s2) -plt.yticks(np.arange(0.1, 1.0, 0.2)) -plt.ylim(0, 1) - -ax3 = plt.subplot(313, sharex=ax1) -ax3.plot(t, s3) -plt.yticks(np.arange(-0.9, 1.0, 0.4)) -plt.ylim(-1, 1) - -xticklabels = ax1.get_xticklabels() + ax2.get_xticklabels() -plt.setp(xticklabels, visible=False) - -plt.show() diff --git a/examples/pylab_examples/ginput_manual_clabel.py b/examples/pylab_examples/ginput_manual_clabel.py old mode 100755 new mode 100644 diff --git a/examples/pylab_examples/hist2d_demo.py b/examples/pylab_examples/hist2d_demo.py deleted file mode 100644 index 7e4bcf0cfc93..000000000000 --- a/examples/pylab_examples/hist2d_demo.py +++ /dev/null @@ -1,13 +0,0 @@ -import matplotlib.pyplot as plt -import numpy as np - -# Fixing random state for reproducibility -np.random.seed(19680801) - - -x = np.random.randn(1000) -y = np.random.randn(1000) + 5 - -# normal distribution center at x=0 and y=5 -plt.hist2d(x, y, bins=40) -plt.show() diff --git a/examples/pylab_examples/hist2d_log_demo.py b/examples/pylab_examples/hist2d_log_demo.py deleted file mode 100644 index 22fcbb319826..000000000000 --- a/examples/pylab_examples/hist2d_log_demo.py +++ /dev/null @@ -1,15 +0,0 @@ -from matplotlib.colors import LogNorm -import matplotlib.pyplot as plt -import numpy as np - -# Fixing random state for reproducibility -np.random.seed(19680801) - - -# normal distribution center at x=0 and y=5 -x = np.random.randn(100000) -y = np.random.randn(100000) + 5 - -plt.hist2d(x, y, bins=40, norm=LogNorm()) -plt.colorbar() -plt.show() diff --git a/examples/pylab_examples/hist_colormapped.py b/examples/pylab_examples/hist_colormapped.py deleted file mode 100644 index 490eaeeba3f2..000000000000 --- a/examples/pylab_examples/hist_colormapped.py +++ /dev/null @@ -1,27 +0,0 @@ -import numpy as np -import matplotlib.pyplot as plt -import matplotlib.cm as cm -import matplotlib.colors as colors - -# Fixing random state for reproducibility -np.random.seed(19680801) - - -fig, ax = plt.subplots() -Ntotal = 1000 -N, bins, patches = ax.hist(np.random.rand(Ntotal), 20) - -# I'll color code by height, but you could use any scalar - - -# we need to normalize the data to 0..1 for the full -# range of the colormap -fracs = N.astype(float)/N.max() -norm = colors.Normalize(fracs.min(), fracs.max()) - -for thisfrac, thispatch in zip(fracs, patches): - color = cm.viridis(norm(thisfrac)) - thispatch.set_facecolor(color) - - -plt.show() diff --git a/examples/pylab_examples/histogram_percent_demo.py b/examples/pylab_examples/histogram_percent_demo.py deleted file mode 100644 index ce62b0a16017..000000000000 --- a/examples/pylab_examples/histogram_percent_demo.py +++ /dev/null @@ -1,19 +0,0 @@ -import matplotlib -from numpy.random import randn -import matplotlib.pyplot as plt -from matplotlib.ticker import PercentFormatter - - -x = randn(5000) - -# Create a figure with some axes. This makes it easier to set the -# formatter later, since that is only available through the OO API. -fig, ax = plt.subplots() - -# Make a normed histogram. It'll be multiplied by 100 later. -ax.hist(x, bins=50, normed=True) - -# Set the formatter. `xmax` sets the value that maps to 100%. -ax.yaxis.set_major_formatter(PercentFormatter(xmax=1)) - -plt.show() diff --git a/examples/pylab_examples/image_clip_path.py b/examples/pylab_examples/image_clip_path.py old mode 100755 new mode 100644 diff --git a/examples/pylab_examples/image_demo2.py b/examples/pylab_examples/image_demo2.py old mode 100755 new mode 100644 diff --git a/examples/pylab_examples/image_origin.py b/examples/pylab_examples/image_origin.py old mode 100755 new mode 100644 diff --git a/examples/pylab_examples/logo.py b/examples/pylab_examples/logo.py old mode 100755 new mode 100644 diff --git a/examples/pylab_examples/mathtext_demo.py b/examples/pylab_examples/mathtext_demo.py old mode 100755 new mode 100644 diff --git a/examples/pylab_examples/mathtext_examples.py b/examples/pylab_examples/mathtext_examples.py old mode 100755 new mode 100644 diff --git a/examples/pylab_examples/matshow.py b/examples/pylab_examples/matshow.py old mode 100755 new mode 100644 diff --git a/examples/pylab_examples/movie_demo.py b/examples/pylab_examples/movie_demo.py old mode 100755 new mode 100644 diff --git a/examples/pylab_examples/mri_demo.py b/examples/pylab_examples/mri_demo.py old mode 100755 new mode 100644 diff --git a/examples/pylab_examples/mri_with_eeg.py b/examples/pylab_examples/mri_with_eeg.py old mode 100755 new mode 100644 diff --git a/examples/pylab_examples/multicolored_line.py b/examples/pylab_examples/multicolored_line.py deleted file mode 100644 index 386cea0a438b..000000000000 --- a/examples/pylab_examples/multicolored_line.py +++ /dev/null @@ -1,53 +0,0 @@ -''' -Color parts of a line based on its properties, e.g., slope. -''' - -import numpy as np -import matplotlib.pyplot as plt -from matplotlib.collections import LineCollection -from matplotlib.colors import ListedColormap, BoundaryNorm - -x = np.linspace(0, 3 * np.pi, 500) -y = np.sin(x) -z = np.cos(0.5 * (x[:-1] + x[1:])) # first derivative - -# Create a colormap for red, green and blue and a norm to color -# f' < -0.5 red, f' > 0.5 blue, and the rest green -cmap = ListedColormap(['r', 'g', 'b']) -norm = BoundaryNorm([-1, -0.5, 0.5, 1], cmap.N) - -# Create a set of line segments so that we can color them individually -# This creates the points as a N x 1 x 2 array so that we can stack points -# together easily to get the segments. The segments array for line collection -# needs to be numlines x points per line x 2 (x and y) -points = np.array([x, y]).T.reshape(-1, 1, 2) -segments = np.concatenate([points[:-1], points[1:]], axis=1) - -# Create the line collection object, setting the colormapping parameters. -# Have to set the actual values used for colormapping separately. -lc = LineCollection(segments, cmap=cmap, norm=norm) -lc.set_array(z) -lc.set_linewidth(3) - -fig1 = plt.figure() -plt.gca().add_collection(lc) -plt.xlim(x.min(), x.max()) -plt.ylim(-1.1, 1.1) - -# Now do a second plot coloring the curve using a continuous colormap -t = np.linspace(0, 10, 200) -x = np.cos(np.pi * t) -y = np.sin(t) -points = np.array([x, y]).T.reshape(-1, 1, 2) -segments = np.concatenate([points[:-1], points[1:]], axis=1) - -lc = LineCollection(segments, cmap=plt.get_cmap('copper'), - norm=plt.Normalize(0, 10)) -lc.set_array(t) -lc.set_linewidth(3) - -fig2 = plt.figure() -plt.gca().add_collection(lc) -plt.xlim(-1, 1) -plt.ylim(-1, 1) -plt.show() diff --git a/examples/pylab_examples/nan_test.py b/examples/pylab_examples/nan_test.py old mode 100755 new mode 100644 diff --git a/examples/pylab_examples/polar_legend.py b/examples/pylab_examples/polar_legend.py old mode 100755 new mode 100644 diff --git a/examples/pylab_examples/quadmesh_demo.py b/examples/pylab_examples/quadmesh_demo.py old mode 100755 new mode 100644 diff --git a/examples/pylab_examples/scatter_profile.py b/examples/pylab_examples/scatter_profile.py old mode 100755 new mode 100644 diff --git a/examples/pylab_examples/spectrum_demo.py b/examples/pylab_examples/spectrum_demo.py index 3ad242d2c7ae..44e1b31a42d9 100644 --- a/examples/pylab_examples/spectrum_demo.py +++ b/examples/pylab_examples/spectrum_demo.py @@ -1,32 +1,52 @@ +""" +======================== +Spectrum Representations +======================== + +The plots show different spectrum representations of a sine signal with +additive noise. A (frequency) spectrum of a discrete-time signal is calculated +by utilizing the fast Fourier transform (FFT). +""" import matplotlib.pyplot as plt import numpy as np np.random.seed(0) -dt = 0.01 -Fs = 1/dt +dt = 0.01 # sampling interval +Fs = 1/dt # sampling frequency t = np.arange(0, 10, dt) + +# generate noise: nse = np.random.randn(len(t)) r = np.exp(-t/0.05) - cnse = np.convolve(nse, r)*dt cnse = cnse[:len(t)] -s = 0.1*np.sin(2*np.pi*t) + cnse -plt.subplot(3, 2, 1) -plt.plot(t, s) +s = 0.1*np.sin(4*np.pi*t) + cnse # the signal + +fig, axes = plt.subplots(nrows=3, ncols=2, figsize=(7, 7)) + +# plot time signal: +axes[0, 0].set_title("Signal") +axes[0, 0].plot(t, s, color='C0') +axes[0, 0].set_xlabel("Time") +axes[0, 0].set_ylabel("Amplitude") + +# plot different spectrum types: +axes[1, 0].set_title("Magnitude Spectrum") +axes[1, 0].magnitude_spectrum(s, Fs=Fs, color='C1') -plt.subplot(3, 2, 3) -plt.magnitude_spectrum(s, Fs=Fs) +axes[1, 1].set_title("Log. Magnitude Spectrum") +axes[1, 1].magnitude_spectrum(s, Fs=Fs, scale='dB', color='C1') -plt.subplot(3, 2, 4) -plt.magnitude_spectrum(s, Fs=Fs, scale='dB') +axes[2, 0].set_title("Phase Spectrum ") +axes[2, 0].phase_spectrum(s, Fs=Fs, color='C2') -plt.subplot(3, 2, 5) -plt.angle_spectrum(s, Fs=Fs) +axes[2, 1].set_title("Angle Spectrum") +axes[2, 1].angle_spectrum(s, Fs=Fs, color='C2') -plt.subplot(3, 2, 6) -plt.phase_spectrum(s, Fs=Fs) +axes[0, 1].remove() # don't display empty ax +fig.tight_layout() plt.show() diff --git a/examples/pylab_examples/stix_fonts_demo.py b/examples/pylab_examples/stix_fonts_demo.py old mode 100755 new mode 100644 diff --git a/examples/pylab_examples/symlog_demo.py b/examples/pylab_examples/symlog_demo.py old mode 100755 new mode 100644 diff --git a/examples/pylab_examples/tex_unicode_demo.py b/examples/pylab_examples/tex_unicode_demo.py old mode 100755 new mode 100644 diff --git a/examples/pylab_examples/vline_hline_demo.py b/examples/pylab_examples/vline_hline_demo.py index 63f71dff4173..1959b4af8e5e 100644 --- a/examples/pylab_examples/vline_hline_demo.py +++ b/examples/pylab_examples/vline_hline_demo.py @@ -1,8 +1,13 @@ """ -Small demonstration of the hlines and vlines plots. +================= +hlines and vlines +================= + +This example showcases the functions hlines and vlines. """ import matplotlib.pyplot as plt +from matplotlib.transforms import blended_transform_factory as btf import numpy as np import numpy.random as rnd @@ -22,6 +27,7 @@ def f(t): vax.plot(t, s + nse, '^') vax.vlines(t, [0], s) +vax.vlines([1, 2], 0, 1, transform=btf(vax.transData, vax.transAxes), colors='r') vax.set_xlabel('time (s)') vax.set_title('Vertical lines demo') diff --git a/examples/pylab_examples/zorder_demo.py b/examples/pylab_examples/zorder_demo.py old mode 100755 new mode 100644 diff --git a/examples/pyplots/boxplot_demo.py b/examples/pyplots/boxplot_demo.py index 9c38f0aa9e4e..a2de9ea66105 100644 --- a/examples/pyplots/boxplot_demo.py +++ b/examples/pyplots/boxplot_demo.py @@ -1,4 +1,3 @@ -#!/usr/bin/python # # Example boxplot code diff --git a/examples/pyplots/whats_new_98_4_fill_between.py b/examples/pyplots/whats_new_98_4_fill_between.py index 336707291311..deb0c9be372b 100644 --- a/examples/pyplots/whats_new_98_4_fill_between.py +++ b/examples/pyplots/whats_new_98_4_fill_between.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python import matplotlib.mlab as mlab import matplotlib.pyplot as plt import numpy as np diff --git a/examples/shapes_and_collections/artist_reference.py b/examples/shapes_and_collections/plot_artist_reference.py similarity index 100% rename from examples/shapes_and_collections/artist_reference.py rename to examples/shapes_and_collections/plot_artist_reference.py diff --git a/examples/shapes_and_collections/path_patch_demo.py b/examples/shapes_and_collections/plot_path_patch.py similarity index 89% rename from examples/shapes_and_collections/path_patch_demo.py rename to examples/shapes_and_collections/plot_path_patch.py index 6017aa7bc937..dc07c2a5b004 100644 --- a/examples/shapes_and_collections/path_patch_demo.py +++ b/examples/shapes_and_collections/plot_path_patch.py @@ -2,6 +2,9 @@ ================ PathPatch object ================ + +This example shows how to create `Path`\s and `PathPatch` objects through +Matplotlib's API. """ import matplotlib.path as mpath import matplotlib.patches as mpatches diff --git a/examples/shapes_and_collections/scatter_demo.py b/examples/shapes_and_collections/plot_scatter.py similarity index 100% rename from examples/shapes_and_collections/scatter_demo.py rename to examples/shapes_and_collections/plot_scatter.py diff --git a/examples/showcase/firefox.py b/examples/showcase/firefox.py index 7d05a52de761..0f597812fa8f 100644 --- a/examples/showcase/firefox.py +++ b/examples/showcase/firefox.py @@ -2,6 +2,8 @@ ======= Firefox ======= + +This example shows how to create the Firefox logo with path and patches. """ import re diff --git a/examples/showcase/xkcd.py b/examples/showcase/xkcd.py index 4413b167fbe4..8e905f0fca1c 100644 --- a/examples/showcase/xkcd.py +++ b/examples/showcase/xkcd.py @@ -1,3 +1,10 @@ +""" +==== +XKCD +==== + +Shows how to create an xkcd-like plot. +""" import matplotlib.pyplot as plt import numpy as np diff --git a/examples/statistics/plot_hist.py b/examples/statistics/plot_hist.py new file mode 100644 index 000000000000..6e3627a9aeab --- /dev/null +++ b/examples/statistics/plot_hist.py @@ -0,0 +1,102 @@ +""" +========== +Histograms +========== + +Demonstrates how to plot histograms with matplotlib. +""" + +import matplotlib.pyplot as plt +import numpy as np +from matplotlib import colors +from matplotlib.ticker import PercentFormatter + +# Fixing random state for reproducibility +np.random.seed(19680801) + + +############################################################################### +# Generate data and plot a simple histogram +# ----------------------------------------- +# +# To generate a 1D histogram we only need a single vector of numbers. For a 2D +# histogram we'll need a second vector. We'll generate both below, and show +# the histogram for each vector. + +N_points = 100000 +n_bins = 20 + +# Generate a normal distribution, center at x=0 and y=5 +x = np.random.randn(N_points) +y = .4 * x + np.random.randn(100000) + 5 + +fig, axs = plt.subplots(1, 2, sharey=True, tight_layout=True) + +# We can set the number of bins with the `bins` kwarg +axs[0].hist(x, bins=n_bins) +axs[1].hist(y, bins=n_bins) + + +############################################################################### +# Updating histogram colors +# ------------------------- +# +# The histogram method returns (among other things) a `patches` object. This +# gives us access to the properties of the objects drawn. Using this, we can +# edit the histogram to our liking. Let's change the color of each bar +# based on its y value. + +fig, axs = plt.subplots(1, 2, figsize=(10, 5), tight_layout=True) + +# N is the count in each bin, bins is the lower-limit of the bin +N, bins, patches = axs[0].hist(x, bins=n_bins) + +# We'll color code by height, but you could use any scalar +fracs = N.astype(float) / N.max() + +# we need to normalize the data to 0..1 for the full range of the colormap +norm = colors.Normalize(fracs.min(), fracs.max()) + +# Now, we'll loop through our objects and set the color of each accordingly +for thisfrac, thispatch in zip(fracs, patches): + color = plt.cm.viridis(norm(thisfrac)) + thispatch.set_facecolor(color) + +# We can also normalize our inputs by the total number of counts +axs[1].hist(x, bins=n_bins, normed=True) + +# Now we format the y-axis to display percentage +axs[1].yaxis.set_major_formatter(PercentFormatter(xmax=1)) + + +############################################################################### +# Plot a 2D histogram +# ------------------- +# +# To plot a 2D histogram, one only needs two vectors of the same length, +# corresponding to each axis of the histogram. + +fig, ax = plt.subplots(tight_layout=True) +hist = ax.hist2d(x, y) + + +############################################################################### +# Customizing your histogram +# -------------------------- +# +# Customizing a 2D histogram is similar to the 1D case, you can control +# visual components such as the bin size or color normalization. + +fig, axs = plt.subplots(1, 3, figsize=(15, 5), sharex=True, sharey=True, + tight_layout=True) + +# We can increase the number of bins on each axis +axs[0].hist2d(x, y, bins=40) + +# As well as define normalization of the colors +axs[1].hist2d(x, y, bins=40, norm=colors.LogNorm()) + +# We can also define custom numbers of bins for each axis +axs[2].hist2d(x, y, bins=(80, 10), norm=colors.LogNorm()) + +plt.show() diff --git a/examples/subplots_axes_and_figures/ganged_plots.py b/examples/subplots_axes_and_figures/ganged_plots.py new file mode 100644 index 000000000000..4014dabdf046 --- /dev/null +++ b/examples/subplots_axes_and_figures/ganged_plots.py @@ -0,0 +1,40 @@ +""" +========================== +Creating adjacent subplots +========================== + +To create plots that share a common axis (visually) you can set the hspace +between the subplots to zero. Passing sharex=True when creating the subplots +will automatically turn off all x ticks and labels except those on the bottom +axis. + +In this example the plots share a common x axis but you can follow the same +logic to supply a common y axis. +""" +import matplotlib.pyplot as plt +import numpy as np + +t = np.arange(0.0, 2.0, 0.01) + +s1 = np.sin(2 * np.pi * t) +s2 = np.exp(-t) +s3 = s1 * s2 + +fig, axs = plt.subplots(3, 1, sharex=True) +# Remove horizontal space between axes +fig.subplots_adjust(hspace=0) + +# Plot each graph, and manually set the y tick values +axs[0].plot(t, s1) +axs[0].set_yticks(np.arange(-0.9, 1.0, 0.4)) +axs[0].set_ylim(-1, 1) + +axs[1].plot(t, s2) +axs[1].set_yticks(np.arange(0.1, 1.0, 0.2)) +axs[1].set_ylim(0, 1) + +axs[2].plot(t, s3) +axs[2].set_yticks(np.arange(-0.9, 1.0, 0.4)) +axs[2].set_ylim(-1, 1) + +plt.show() diff --git a/examples/tests/backend_driver.py b/examples/tests/backend_driver.py old mode 100755 new mode 100644 index 29db836c6f4f..e084e032f9d8 --- a/examples/tests/backend_driver.py +++ b/examples/tests/backend_driver.py @@ -173,7 +173,6 @@ 'hatch_demo.py', 'hexbin_demo.py', 'hexbin_demo2.py', - 'hist_colormapped.py', 'vline_hline_demo.py', 'image_clip_path.py', @@ -206,7 +205,7 @@ 'multiline.py', 'multiple_figs_demo.py', 'nan_test.py', - 'newscalarformatter_demo.py', + 'plot_scalarformatter.py', 'pcolor_demo.py', 'pcolor_log.py', 'pcolor_small.py', diff --git a/examples/text_labels_and_annotations/autowrap_demo.py b/examples/text_labels_and_annotations/autowrap_demo.py index d56e18f3f86f..fa6080b70c5b 100644 --- a/examples/text_labels_and_annotations/autowrap_demo.py +++ b/examples/text_labels_and_annotations/autowrap_demo.py @@ -1,6 +1,12 @@ """ -Auto-wrapping text demo. +================== +Auto-wrapping text +================== + +Matplotlib can wrap text automatically, but if it's too long, the text will be +displayed slightly outside of the boundaries of the axis anyways. """ + import matplotlib.pyplot as plt fig = plt.figure() @@ -12,7 +18,7 @@ plt.text(6, 5, t, ha='left', rotation=15, wrap=True) plt.text(5, 5, t, ha='right', rotation=-15, wrap=True) plt.text(5, 10, t, fontsize=18, style='oblique', ha='center', - va='top', wrap=True) + va='top', wrap=True) plt.text(3, 4, t, family='serif', style='italic', ha='right', wrap=True) plt.text(-1, 0, t, ha='left', rotation=-15, wrap=True) diff --git a/examples/pylab_examples/alignment_test.py b/examples/text_labels_and_annotations/text_alignment.py similarity index 82% rename from examples/pylab_examples/alignment_test.py rename to examples/text_labels_and_annotations/text_alignment.py index 5de0d6a33a48..2503440c3277 100644 --- a/examples/pylab_examples/alignment_test.py +++ b/examples/text_labels_and_annotations/text_alignment.py @@ -1,22 +1,24 @@ """ +=================== +Precise text layout +=================== + You can precisely layout text in data or axes (0,1) coordinates. This -example shows you some of the alignment and rotation specifications to -layout text +example shows you some of the alignment and rotation specifications for text +layout. """ import matplotlib.pyplot as plt from matplotlib.lines import Line2D from matplotlib.patches import Rectangle -# build a rectangle in axes coords +# Build a rectangle in axes coords left, width = .25, .5 bottom, height = .25, .5 right = left + width top = bottom + height ax = plt.gca() -p = plt.Rectangle((left, bottom), width, height, - fill=False, - ) +p = plt.Rectangle((left, bottom), width, height, fill=False) p.set_transform(ax.transAxes) p.set_clip_on(False) ax.add_patch(p) @@ -47,24 +49,24 @@ verticalalignment='top', transform=ax.transAxes) -ax.text(left, 0.5*(bottom + top), 'right center', +ax.text(left, 0.5 * (bottom + top), 'right center', horizontalalignment='right', verticalalignment='center', rotation='vertical', transform=ax.transAxes) -ax.text(left, 0.5*(bottom + top), 'left center', +ax.text(left, 0.5 * (bottom + top), 'left center', horizontalalignment='left', verticalalignment='center', rotation='vertical', transform=ax.transAxes) -ax.text(0.5*(left + right), 0.5*(bottom + top), 'middle', +ax.text(0.5 * (left + right), 0.5 * (bottom + top), 'middle', horizontalalignment='center', verticalalignment='center', transform=ax.transAxes) -ax.text(right, 0.5*(bottom + top), 'centered', +ax.text(right, 0.5 * (bottom + top), 'centered', horizontalalignment='center', verticalalignment='center', rotation='vertical', diff --git a/examples/text_labels_and_annotations/text_demo_fontdict.py b/examples/text_labels_and_annotations/text_demo_fontdict.py index ae35d222b8d3..ad6fa8cc972b 100644 --- a/examples/text_labels_and_annotations/text_demo_fontdict.py +++ b/examples/text_labels_and_annotations/text_demo_fontdict.py @@ -1,6 +1,12 @@ """ -Demo using fontdict to control style of text and labels. +======================================================= +Controlling style of text and labels using a dictionary +======================================================= + +This example shows how to share parameters across many text objects and labels +by creating a dictionary of options passed across several functions. """ + import numpy as np import matplotlib.pyplot as plt diff --git a/examples/pylab_examples/newscalarformatter_demo.py b/examples/ticks_and_spines/plot_scalarformatter.py similarity index 75% rename from examples/pylab_examples/newscalarformatter_demo.py rename to examples/ticks_and_spines/plot_scalarformatter.py index 381ced7f3b49..ef04408b8dd3 100644 --- a/examples/pylab_examples/newscalarformatter_demo.py +++ b/examples/ticks_and_spines/plot_scalarformatter.py @@ -1,31 +1,21 @@ -import matplotlib.pyplot as plt -import numpy as np -from matplotlib.ticker import OldScalarFormatter, ScalarFormatter +""" +========================================= +Tick formatting using the ScalarFromatter +========================================= -# Example 1 -x = np.arange(0, 1, .01) -fig, [[ax1, ax2], [ax3, ax4]] = plt.subplots(2, 2, figsize=(6, 6)) -fig.text(0.5, 0.975, 'The old formatter', - horizontalalignment='center', verticalalignment='top') -ax1.plot(x * 1e5 + 1e10, x * 1e-10 + 1e-5) -ax1.xaxis.set_major_formatter(OldScalarFormatter()) -ax1.yaxis.set_major_formatter(OldScalarFormatter()) - -ax2.plot(x * 1e5, x * 1e-4) -ax2.xaxis.set_major_formatter(OldScalarFormatter()) -ax2.yaxis.set_major_formatter(OldScalarFormatter()) +The example shows use of ScalarFormatter with different settings. -ax3.plot(-x * 1e5 - 1e10, -x * 1e-5 - 1e-10) -ax3.xaxis.set_major_formatter(OldScalarFormatter()) -ax3.yaxis.set_major_formatter(OldScalarFormatter()) +Example 1 : Default -ax4.plot(-x * 1e5, -x * 1e-4) -ax4.xaxis.set_major_formatter(OldScalarFormatter()) -ax4.yaxis.set_major_formatter(OldScalarFormatter()) +Example 2 : With no Numerical Offset -fig.subplots_adjust(wspace=0.7, hspace=0.6) +Example 3 : With Mathtext +""" +import matplotlib.pyplot as plt +import numpy as np +from matplotlib.ticker import ScalarFormatter -# Example 2 +# Example 1 x = np.arange(0, 1, .01) fig, [[ax1, ax2], [ax3, ax4]] = plt.subplots(2, 2, figsize=(6, 6)) fig.text(0.5, 0.975, 'The new formatter, default settings', @@ -50,7 +40,7 @@ fig.subplots_adjust(wspace=0.7, hspace=0.6) -# Example 3 +# Example 2 x = np.arange(0, 1, .01) fig, [[ax1, ax2], [ax3, ax4]] = plt.subplots(2, 2, figsize=(6, 6)) fig.text(0.5, 0.975, 'The new formatter, no numerical offset', @@ -75,7 +65,7 @@ fig.subplots_adjust(wspace=0.7, hspace=0.6) -# Example 4 +# Example 3 x = np.arange(0, 1, .01) fig, [[ax1, ax2], [ax3, ax4]] = plt.subplots(2, 2, figsize=(6, 6)) fig.text(0.5, 0.975, 'The new formatter, with mathtext', diff --git a/examples/ticks_and_spines/spines_demo_bounds.py b/examples/ticks_and_spines/plot_spines_bounds.py similarity index 93% rename from examples/ticks_and_spines/spines_demo_bounds.py rename to examples/ticks_and_spines/plot_spines_bounds.py index 14e272584ea7..fd66eb5612bd 100644 --- a/examples/ticks_and_spines/spines_demo_bounds.py +++ b/examples/ticks_and_spines/plot_spines_bounds.py @@ -1,4 +1,8 @@ """ +=================== +Custom spine bounds +=================== + Demo of spines using custom bounds to limit the extent of the spine. """ import numpy as np diff --git a/examples/ticks_and_spines/spines_demo.py b/examples/ticks_and_spines/spines_demo.py index 0b5e450ed3b7..6c25e899c87b 100644 --- a/examples/ticks_and_spines/spines_demo.py +++ b/examples/ticks_and_spines/spines_demo.py @@ -1,8 +1,12 @@ """ -Basic demo of axis spines. - -This demo compares a normal axes, with spines on all four sides, and an axes -with spines only on the left and bottom. +====== +Spines +====== + +This demo compares: + - normal axes, with spines on all four sides; + - an axes with spines only on the left and bottom; + - an axes using custom bounds to limit the extent of the spine. """ import numpy as np import matplotlib.pyplot as plt @@ -11,7 +15,7 @@ x = np.linspace(0, 2 * np.pi, 100) y = 2 * np.sin(x) -fig, (ax0, ax1) = plt.subplots(nrows=2) +fig, (ax0, ax1, ax2) = plt.subplots(nrows=3) ax0.plot(x, y) ax0.set_title('normal spines') @@ -26,7 +30,17 @@ ax1.yaxis.set_ticks_position('left') ax1.xaxis.set_ticks_position('bottom') +ax2.plot(x, y) + +# Only draw spine between the y-ticks +ax2.spines['left'].set_bounds(-1, 1) +# Hide the right and top spines +ax2.spines['right'].set_visible(False) +ax2.spines['top'].set_visible(False) +# Only show ticks on the left and bottom spines +ax2.yaxis.set_ticks_position('left') +ax2.xaxis.set_ticks_position('bottom') + # Tweak spacing between subplots to prevent labels from overlapping plt.subplots_adjust(hspace=0.5) - plt.show() diff --git a/examples/ticks_and_spines/spines_demo_dropped.py b/examples/ticks_and_spines/spines_demo_dropped.py index db515dfe800b..4b7bbbac3a70 100644 --- a/examples/ticks_and_spines/spines_demo_dropped.py +++ b/examples/ticks_and_spines/spines_demo_dropped.py @@ -1,4 +1,8 @@ """ +============== +Dropped spines +============== + Demo of spines offset from the axes (a.k.a. "dropped spines"). """ import numpy as np diff --git a/examples/ticks_and_spines/tick-formatters.py b/examples/ticks_and_spines/tick-formatters.py index 13f17ab1ac02..b233884290b0 100644 --- a/examples/ticks_and_spines/tick-formatters.py +++ b/examples/ticks_and_spines/tick-formatters.py @@ -1,5 +1,9 @@ """ -Show the different tick formatters +=============== +Tick formatters +=============== + +Show the different tick formatters. """ import numpy as np diff --git a/examples/ticks_and_spines/tick-locators.py b/examples/ticks_and_spines/tick-locators.py index c9d0dc6cb437..072d5e9ec9ce 100644 --- a/examples/ticks_and_spines/tick-locators.py +++ b/examples/ticks_and_spines/tick-locators.py @@ -1,5 +1,9 @@ """ -Show the different tick locators +============= +Tick locators +============= + +Show the different tick locators. """ import numpy as np diff --git a/examples/ticks_and_spines/tick_labels_from_values.py b/examples/ticks_and_spines/tick_labels_from_values.py index 2073442cc6b5..fca78eb46ff1 100644 --- a/examples/ticks_and_spines/tick_labels_from_values.py +++ b/examples/ticks_and_spines/tick_labels_from_values.py @@ -1,6 +1,7 @@ """ - -Basic demo showing how to set tick labels to values of a series. +========================================= +Setting tick labels from a list of values +========================================= Using ax.set_xticks causes the tick labels to be set on the currently chosen ticks. However, you may want to allow matplotlib to dynamically @@ -28,6 +29,8 @@ def format_fn(tick_val, tick_pos): return labels[int(tick_val)] else: return '' + + ax.xaxis.set_major_formatter(FuncFormatter(format_fn)) ax.xaxis.set_major_locator(MaxNLocator(integer=True)) ax.plot(xs, ys) diff --git a/examples/ticks_and_spines/ticklabels_demo_rotation.py b/examples/ticks_and_spines/ticklabels_demo_rotation.py index 9c1c49b2e4d6..b5bb4c64fecb 100644 --- a/examples/ticks_and_spines/ticklabels_demo_rotation.py +++ b/examples/ticks_and_spines/ticklabels_demo_rotation.py @@ -1,4 +1,8 @@ """ +=========================== +Rotating custom tick labels +=========================== + Demo of custom tick-labels with user-defined rotation. """ import matplotlib.pyplot as plt diff --git a/examples/user_interfaces/embedding_in_gtk3.py b/examples/user_interfaces/embedding_in_gtk3.py old mode 100755 new mode 100644 diff --git a/examples/user_interfaces/embedding_in_qt4.py b/examples/user_interfaces/embedding_in_qt4.py old mode 100755 new mode 100644 diff --git a/examples/user_interfaces/embedding_in_qt5.py b/examples/user_interfaces/embedding_in_qt5.py old mode 100755 new mode 100644 diff --git a/examples/user_interfaces/embedding_in_tk.py b/examples/user_interfaces/embedding_in_tk.py old mode 100755 new mode 100644 diff --git a/examples/user_interfaces/embedding_in_tk_canvas.py b/examples/user_interfaces/embedding_in_tk_canvas.py old mode 100755 new mode 100644 diff --git a/examples/user_interfaces/embedding_in_wx3.py b/examples/user_interfaces/embedding_in_wx3.py old mode 100755 new mode 100644 diff --git a/examples/user_interfaces/interactive.py b/examples/user_interfaces/interactive.py old mode 100755 new mode 100644 diff --git a/examples/user_interfaces/mpl_with_glade.py b/examples/user_interfaces/mpl_with_glade.py old mode 100755 new mode 100644 diff --git a/examples/user_interfaces/svg_histogram.py b/examples/user_interfaces/svg_histogram.py old mode 100755 new mode 100644 diff --git a/examples/widgets/cursor.py b/examples/widgets/cursor.py old mode 100755 new mode 100644 diff --git a/examples/widgets/span_selector.py b/examples/widgets/span_selector.py old mode 100755 new mode 100644 diff --git a/extern/agg24-svn/include/agg_rasterizer_cells_aa.h b/extern/agg24-svn/include/agg_rasterizer_cells_aa.h old mode 100755 new mode 100644 diff --git a/extern/agg24-svn/include/agg_rasterizer_compound_aa.h b/extern/agg24-svn/include/agg_rasterizer_compound_aa.h old mode 100755 new mode 100644 diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 5ffd8a7bae08..c7497d8997c4 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -2362,7 +2362,7 @@ def stem(self, *args, **kwargs): If no *x* values are provided, the default is (0, 1, ..., len(y) - 1) Return value is a tuple (*markerline*, *stemlines*, - *baseline*). + *baseline*). See :class:`~matplotlib.container.StemContainer` .. seealso:: This @@ -2475,7 +2475,7 @@ def pie(self, x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None, radius=None, counterclock=True, wedgeprops=None, textprops=None, center=(0, 0), - frame=False): + frame=False, rotatelabels=False): r""" Plot a pie chart. @@ -2542,6 +2542,9 @@ def pie(self, x, explode=None, labels=None, colors=None, *frame*: [ *False* | *True* ] Plot axes frame with the chart. + *rotatelabels*: [ *False* | *True* ] + Rotate each label to the angle of the corresponding slice. + The pie chart will probably look best if the figure and axes are square, or the Axes aspect is equal. e.g.:: @@ -2639,12 +2642,18 @@ def get_next_color(): xt = x + labeldistance * radius * math.cos(thetam) yt = y + labeldistance * radius * math.sin(thetam) - label_alignment = xt > 0 and 'left' or 'right' + label_alignment_h = xt > 0 and 'left' or 'right' + label_alignment_v = 'center' + label_rotation = 'horizontal' + if rotatelabels: + label_alignment_v = yt > 0 and 'bottom' or 'top' + label_rotation = np.rad2deg(thetam) + (0 if xt > 0 else 180) t = self.text(xt, yt, label, size=rcParams['xtick.labelsize'], - horizontalalignment=label_alignment, - verticalalignment='center', + horizontalalignment=label_alignment_h, + verticalalignment=label_alignment_v, + rotation=label_rotation, **textprops) texts.append(t) @@ -2820,6 +2829,9 @@ def errorbar(self, x, y, yerr=None, xerr=None, fmt_style_kwargs = {k: v for k, v in zip(('linestyle', 'marker', 'color'), _process_plot_format(fmt)) if v is not None} + if fmt == 'none': + # Remove alpha=0 color that _process_plot_format returns + fmt_style_kwargs.pop('color') if ('color' in kwargs or 'color' in fmt_style_kwargs or ecolor is not None): @@ -3902,7 +3914,7 @@ def scatter(self, x, y, s=None, c=None, marker=None, cmap=None, norm=None, Examples -------- - .. plot:: mpl_examples/shapes_and_collections/scatter_demo.py + .. plot:: mpl_examples/shapes_and_collections/plot_scatter.py """ @@ -6499,7 +6511,7 @@ def hist2d(self, x, y, bins=10, range=None, normed=False, weights=None, Examples -------- - .. plot:: mpl_examples/pylab_examples/hist2d_demo.py + .. plot:: mpl_examples/statistics/plot_hist.py """ # xrange becomes range after 2to3 diff --git a/lib/matplotlib/axes/_base.py b/lib/matplotlib/axes/_base.py index 081874fe540b..07735ae0aef6 100644 --- a/lib/matplotlib/axes/_base.py +++ b/lib/matplotlib/axes/_base.py @@ -718,10 +718,12 @@ def get_xaxis_text1_transform(self, pad_points): place axis elements in different locations. """ + labels_align = matplotlib.rcParams["xtick.alignment"] + return (self.get_xaxis_transform(which='tick1') + mtransforms.ScaledTranslation(0, -1 * pad_points / 72.0, self.figure.dpi_scale_trans), - "top", "center") + "top", labels_align) def get_xaxis_text2_transform(self, pad_points): """ @@ -744,10 +746,11 @@ def get_xaxis_text2_transform(self, pad_points): place axis elements in different locations. """ + labels_align = matplotlib.rcParams["xtick.alignment"] return (self.get_xaxis_transform(which='tick2') + mtransforms.ScaledTranslation(0, pad_points / 72.0, self.figure.dpi_scale_trans), - "bottom", "center") + "bottom", labels_align) def get_yaxis_transform(self, which='grid'): """ @@ -795,10 +798,11 @@ def get_yaxis_text1_transform(self, pad_points): place axis elements in different locations. """ + labels_align = matplotlib.rcParams["ytick.alignment"] return (self.get_yaxis_transform(which='tick1') + mtransforms.ScaledTranslation(-1 * pad_points / 72.0, 0, self.figure.dpi_scale_trans), - "center_baseline", "right") + labels_align, "right") def get_yaxis_text2_transform(self, pad_points): """ @@ -821,10 +825,12 @@ def get_yaxis_text2_transform(self, pad_points): place axis elements in different locations. """ + labels_align = matplotlib.rcParams["ytick.alignment"] + return (self.get_yaxis_transform(which='tick2') + mtransforms.ScaledTranslation(pad_points / 72.0, 0, self.figure.dpi_scale_trans), - "center_baseline", "left") + labels_align, "left") def _update_transScale(self): self.transScale.set( @@ -2541,13 +2547,10 @@ def ticklabel_format(self, **kwargs): raise ValueError("scilimits must be a sequence of 2 integers") if style[:3] == 'sci': sb = True - elif style in ['plain', 'comma']: + elif style == 'plain': sb = False - if style == 'plain': - cb = False - else: - cb = True - raise NotImplementedError("comma style remains to be added") + elif style == 'comma': + raise NotImplementedError("comma style remains to be added") elif style == '': sb = None else: @@ -2878,6 +2881,11 @@ def set_xlim(self, left=None, right=None, emit=True, auto=False, **kw): if right is not None: right = self.convert_xunits(right) + if ((left is not None and not np.isfinite(left)) or + (right is not None and not np.isfinite(right))): + raise ValueError("Specified x limits must be finite; " + "instead, found: (%s, %s)" % (left, right)) + old_left, old_right = self.get_xlim() if left is None: left = old_left @@ -3172,6 +3180,11 @@ def set_ylim(self, bottom=None, top=None, emit=True, auto=False, **kw): if top is not None: top = self.convert_yunits(top) + if ((top is not None and not np.isfinite(top)) or + (bottom is not None and not np.isfinite(bottom))): + raise ValueError("Specified y limits must be finite; " + "instead, found: (%s, %s)" % (bottom, top)) + old_bottom, old_top = self.get_ylim() if bottom is None: diff --git a/lib/matplotlib/backends/backend_pgf.py b/lib/matplotlib/backends/backend_pgf.py index b9c38b07cb5b..51d8fa2d1f86 100644 --- a/lib/matplotlib/backends/backend_pgf.py +++ b/lib/matplotlib/backends/backend_pgf.py @@ -191,10 +191,9 @@ def make_pdf_to_png_converter(): # pick converter if "pdftocairo" in tools_available: def cairo_convert(pdffile, pngfile, dpi): - cmd = [str("pdftocairo"), "-singlefile", "-png", - "-r %d" % dpi, pdffile, os.path.splitext(pngfile)[0]] - # for some reason this doesn't work without shell - check_output(cmd, shell=True, stderr=subprocess.STDOUT) + cmd = [str("pdftocairo"), "-singlefile", "-png", "-r", "%d" % dpi, + pdffile, os.path.splitext(pngfile)[0]] + check_output(cmd, stderr=subprocess.STDOUT) return cairo_convert elif "gs" in tools_available: def gs_convert(pdffile, pngfile, dpi): diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index 8b0e8350d6af..59c17c8a9392 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -1247,25 +1247,29 @@ class BoundaryNorm(Normalize): """ def __init__(self, boundaries, ncolors, clip=False): """ - *boundaries* - a monotonically increasing sequence - *ncolors* - number of colors in the colormap to be used - - If:: - - b[i] <= v < b[i+1] + Parameters + ---------- + boundaries : array-like + Monotonically increasing sequence of boundaries + ncolors : int + Number of colors in the colormap to be used + clip : bool, optional + If clip is ``True``, out of range values are mapped to 0 if they + are below ``boundaries[0]`` or mapped to ncolors - 1 if they are + above ``boundaries[-1]``. + + If clip is ``False``, out of range values are mapped to -1 if + they are below ``boundaries[0]`` or mapped to ncolors if they are + above ``boundaries[-1]``. These are then converted to valid indices + by :meth:`Colormap.__call__`. - then v is mapped to color j; - as i varies from 0 to len(boundaries)-2, - j goes from 0 to ncolors-1. + Notes + ----- + *boundaries* defines the edges of bins, and data falling within a bin + is mapped to the color with the same index. - Out-of-range values are mapped - to -1 if low and ncolors if high; these are converted - to valid indices by - :meth:`Colormap.__call__` . - If clip == True, out-of-range values - are mapped to 0 if low and ncolors-1 if high. + If the number of bins doesn't equal *ncolors*, the color is chosen + by linear interpolation of the bin number onto color numbers. """ self.clip = clip self.vmin = boundaries[0] @@ -1304,6 +1308,13 @@ def __call__(self, value, clip=None): return ret def inverse(self, value): + """ + Raises + ------ + ValueError + BoundaryNorm is not invertible, so calling this method will always + raise an error + """ return ValueError("BoundaryNorm is not invertible") diff --git a/lib/matplotlib/contour.py b/lib/matplotlib/contour.py index 4377e51ecfb7..3264c67ad2e8 100644 --- a/lib/matplotlib/contour.py +++ b/lib/matplotlib/contour.py @@ -1542,6 +1542,8 @@ def _check_xyz(self, args, kwargs): if z.ndim != 2: raise TypeError("Input z must be a 2D array.") + elif z.shape[0] < 2 or z.shape[1] < 2: + raise TypeError("Input z must be at least a 2x2 array.") else: Ny, Nx = z.shape @@ -1590,6 +1592,8 @@ def _initialize_x_y(self, z): """ if z.ndim != 2: raise TypeError("Input must be a 2D array.") + elif z.shape[0] < 2 or z.shape[1] < 2: + raise TypeError("Input z must be at least a 2x2 array.") else: Ny, Nx = z.shape if self.origin is None: # Not for image-matching. diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py index f6184fd2cfcb..521e3fe603a2 100644 --- a/lib/matplotlib/figure.py +++ b/lib/matplotlib/figure.py @@ -1827,17 +1827,10 @@ def subplots_adjust(self, *args, **kwargs): def ginput(self, n=1, timeout=30, show_clicks=True, mouse_add=1, mouse_pop=3, mouse_stop=2): """ - Blocking call to interact with the figure. - - This will wait for *n* clicks from the user and return a list of the - coordinates of each click. - - If *timeout* is zero or negative, does not timeout. + Blocking call to interact with a figure. - If *n* is zero or negative, accumulate clicks until a middle click - (or potentially both mouse buttons at once) terminates the input. - - Right clicking cancels last input. + Wait until the user clicks *n* times on the figure, and return the + coordinates of each click in a list. The buttons used for the various actions (adding points, removing points, terminating the inputs) can be overriden via the @@ -1845,6 +1838,30 @@ def ginput(self, n=1, timeout=30, show_clicks=True, mouse_add=1, the associated mouse button: 1 for left, 2 for middle, 3 for right. + Parameters + ---------- + n : int, optional, default: 1 + Number of mouse clicks to accumulate. If negative, accumulate + clicks until the input is terminated manually. + timeout : scalar, optional, default: 30 + Number of seconds to wait before timing out. If zero or negative + will never timeout. + show_clicks : bool, optional, default: False + If True, show a red cross at the location of each click. + mouse_add : int, one of (1, 2, 3), optional, default: 1 (left click) + Mouse button used to add points. + mouse_pop : int, one of (1, 2, 3), optional, default: 3 (right click) + Mouse button used to remove the most recently added point. + mouse_stop : int, one of (1, 2, 3), optional, default: 2 (middle click) + Mouse button used to stop input. + + Returns + ------- + points : list of tuples + A list of the clicked (x, y) coordinates. + + Notes + ----- The keyboard can also be used to select points in case your mouse does not have one or more of the buttons. The delete and backspace keys act like right clicking (i.e., remove last point), the enter key diff --git a/lib/matplotlib/fontconfig_pattern.py b/lib/matplotlib/fontconfig_pattern.py index 058e824d95cb..d7513eae48f3 100644 --- a/lib/matplotlib/fontconfig_pattern.py +++ b/lib/matplotlib/fontconfig_pattern.py @@ -21,9 +21,15 @@ import six -import re, sys -from pyparsing import Literal, ZeroOrMore, \ - Optional, Regex, StringEnd, ParseException, Suppress +import re +import sys +from pyparsing import (Literal, ZeroOrMore, Optional, Regex, StringEnd, + ParseException, Suppress) + +try: + from functools import lru_cache +except ImportError: + from backports.functools_lru_cache import lru_cache family_punc = r'\\\-:,' family_unescape = re.compile(r'\\([%s])' % family_punc).sub @@ -166,7 +172,13 @@ def _property(self, s, loc, tokens): self._properties.setdefault(key, []).extend(val) return [] -parse_fontconfig_pattern = FontconfigPatternParser().parse + +# `parse_fontconfig_pattern` is a bottleneck during the tests because it is +# repeatedly called when the rcParams are reset (to validate the default +# fonts). In practice, the cache size doesn't grow beyond a few dozen entries +# during the test suite. +parse_fontconfig_pattern = lru_cache()(FontconfigPatternParser().parse) + def generate_fontconfig_pattern(d): """ @@ -180,7 +192,8 @@ def generate_fontconfig_pattern(d): val = getattr(d, 'get_' + key)() if val is not None and val != []: if type(val) == list: - val = [value_escape(r'\\\1', str(x)) for x in val if x is not None] + val = [value_escape(r'\\\1', str(x)) for x in val + if x is not None] if val != []: val = ','.join(val) props.append(":%s=%s" % (key, val)) diff --git a/lib/matplotlib/image.py b/lib/matplotlib/image.py index 6e716b74300a..19dfb16615f3 100644 --- a/lib/matplotlib/image.py +++ b/lib/matplotlib/image.py @@ -375,9 +375,20 @@ def _make_image(self, A, in_bbox, out_bbox, clip_bbox, magnification=1.0, # this is to work around spurious warnings coming # out of masked arrays. with np.errstate(invalid='ignore'): - rgba[..., 1] = A < 0 # under data - rgba[..., 2] = A > 1 # over data - rgba[..., 3] = ~A.mask # bad data + rgba[..., 1] = np.where(A < 0, np.nan, 1) # under data + rgba[..., 2] = np.where(A > 1, np.nan, 1) # over data + # Have to invert mask, Agg knows what alpha means + # so if you put this in as 0 for 'good' points, they + # all get zeroed out + rgba[..., 3] = 1 + if A.mask.shape == A.shape: + # this is the case of a nontrivial mask + mask = np.where(A.mask, np.nan, 1) + else: + # this is the case that the mask is a + # numpy.bool_ of False + mask = A.mask + # ~A.mask # masked data A = rgba output = np.zeros((out_height, out_width, 4), dtype=A.dtype) @@ -418,12 +429,37 @@ def _make_image(self, A, in_bbox, out_bbox, clip_bbox, magnification=1.0, # Convert back to a masked greyscale array so # colormapping works correctly hid_output = output + # any pixel where the a masked pixel is included + # in the kernel (pulling this down from 1) needs to + # be masked in the output + if len(mask.shape) == 2: + out_mask = np.empty((out_height, out_width), + dtype=mask.dtype) + _image.resample(mask, out_mask, t, + _interpd_[self.get_interpolation()], + True, 1, + self.get_filternorm() or 0.0, + self.get_filterrad() or 0.0) + out_mask = np.isnan(out_mask) + else: + out_mask = mask + # we need to mask both pixels which came in as masked + # and the pixels that Agg is telling us to ignore (relavent + # to non-affine transforms) + # Use half alpha as the threshold for pixels to mask. + out_mask = out_mask | (hid_output[..., 3] < .5) output = np.ma.masked_array( - hid_output[..., 0], hid_output[..., 3] < 0.5) - # relabel under data - output[hid_output[..., 1] > .5] = -1 + hid_output[..., 0], + out_mask) + # 'unshare' the mask array to + # needed to suppress numpy warning + del out_mask + invalid_mask = ~output.mask * ~np.isnan(output.data) + # relabel under data. If any of the input data for + # the pixel has input out of the norm bounds, + output[np.isnan(hid_output[..., 1]) * invalid_mask] = -1 # relabel over data - output[hid_output[..., 2] > .5] = 2 + output[np.isnan(hid_output[..., 2]) * invalid_mask] = 2 output = self.to_rgba(output, bytes=True, norm=False) diff --git a/lib/matplotlib/mpl-data/sample_data/necked_tensile_specimen.png b/lib/matplotlib/mpl-data/sample_data/necked_tensile_specimen.png deleted file mode 100644 index 31a2250423cadf24945f7ee9bee149e5c60475ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95151 zcmZ^Kc|4Tw+cwkKDjAeQ_9SU2g~(2}30V>*J6Xnog4w4YRhEx*-h>$d`uZ z)E7p2;EnC(>0TNd@D*n@wTIejYWxq~QBR#+9cXCovW7jHM2#7rSByXze&SH#H`RRe z_IueQBX})07p9$FJ0WjHha+!c^!k+W*DT4mxX7A<)JW_nvc z;%;-5w$YpGpS898=G#~VuCCBM`d#O3D`M34WQT&6os^xsH)lDfu3+ViP2+qNo?Kj- z(R(E+p@1VXQ}^vateheXSu=7m}2Yb%d^uM+)uMbLtLB*hyfDddh`#VGw^aPZcV*0KxUBEEb z)63V7K9#7pu{w3BGvW6mH}0>3Pva^v@iy+gza?UySKm5j5l{EpUbYA^J@}AUYgfY( zF(I~V+!&!Wg5AEn4lB1RtJSs%q}z+74ETdy@)>Lw#Rqs!%xPL#Va`v`Ptf`GKPxz+ zd*I@A%kT1~Fa0~hOYb{{?v8jlvQ>V%7_?@xS2b!kA6M9Ehhr1=7~xi0q(Ul9Gc!0tl}x>78QUp} ztV{Zq$cI1o)%znSon+w*>VE*j&ebWMij0LZd1! zHb8R>^6qt%J!|UvVya|Bq&?)btz5pz?a2PATxK+VnGx0^*K&^Tv^!Gn!u7#`Ydc%@ z`d-Eya(WLp50wM1g&X`Nu5nR%Vvk;@mBYlgh4lMw-GQ&L^E0qJdC3eY79bEx%je{~ z>Ff4>t~4SLo`=u3qQ@hV9n$4)?YM7yqh(*9he$)vJ!{{$$sfDdy}vQN6yi~MLOUqT zyo8!E>mwPGzU1aD?g#e?U2Re7RQxee`@8S+QO;43TcK6q#i7Z2E}@+F@~;G34-lhX z3lIsApgwr(Y4%l+dc`8CF;1LLwr;H&r~LJ!h#r4VOGmSGwq8{h%A*OLtg==`-j@+Ks=57JG7-jb$a| z8%lS!k8TSUct82@H~H;Lxy-jBS`llJ`fVM5ZiA{b>-Q}8u9oMY+Br&KzbPj-g}m`V zxbya(47ukf_qR`bruX$&py?;i!7$O)muQGAac;9>cEOHgD{^t1Gy(JSTcp-bh3S_5=i}ZS3&wuuIP9($5 z*M>iHxmq*yaYl0GlLtHtus`FT)%`Dn$d7tO)bH`ha2=P*aNV;KJm%B4#ETa%#9!PNN4Yyn+>(`*mAEM>At?z3T0lK~ z+&pbwLft%s{yoTl$5D6iuyc2Q=IM-b<3AbK#unw}sURqLGSNSO|6Zr3^V9#C$<5aEb7YFAXX0Z;X=s#bwAEFNU(zl&oasZty*a9SS2|X%T7PlOCAimx*2|n`GRFwe7vghyT<}1Gd}DT`qL6_3HhA_<5`S@>Y86#!4+= z;yB^r0ipoLSQ6S?>DcS7G{0Yvf!(F7?o=LRrXQ0R$SX%hb6KQZ_p1jR;~l-LN}JnR z%M(Y32N_8{wVV#IX!M_jju$BOQE~#TW<(gAtls=nrpj(^3hvF~@%%GOE`f0@cDZN6 z<0tPHVI00d5TG9DH@zSSv-nSyJdjbfb_P$>d!DM00J|`b_B=bcP>f|CzD@H^>%L^3 zBshsQENE0|vjnZ(QW@>W&LI2T;>x-@Etx<1QVBP!wxTC0m)TcC*p~bTNnELv-;qmo zBU!bZ-umeX7)8}u93<%L!J2sV5WGw;`)d35;LEi~XXFT$P?{DK-F8y(U&L-c8^OHp za}ys}Ue-5KR)zjFR(3SfI8vc=`$^)lR_?%u0+8#sRf`)&*TJ};pzsL}4Hd-?kmlUz ziDLCxUzume?`KKj2`mF`n?U|>-x%G94@H{xnZR~Pj6^IaDe*2ievd+fV*L#R!&N98O!W03InCS8wo!`y>} z0RA7lDFX`@&VgfB(>50gtdRb?9o7lc<8?vz?XV~lnHBmaZL8wwB6r1_C-)3g1J`4c z)-JBs?l$W3Ov9FX0+b}U@CIxB7F_9tC$5Jd9EIeaeeI8g1OhBwIQm8rl z;sWUtOGahz93ebz1%BsUHDR(a7Jj2R8qX1sIcpTz#nueoJ6z>W94`Qa?7&V=gfh9UB;iXd=BxX@-p zpeHn}WZ4o->(-Yd=s#b@Y>b(t)G?Z#k#TwMR~AABrROKvQkfX+H9mficsiT; z4Eu)%tIMae@Z?wrS8Xcu>aKZ7^}0&u>IHb)6Gf)rT411_`wuAzkmje8T%jUT)`>N7 zR%z=k!rU{@nmFj4mUty%$qlTPn5bI5H?V{63O2e*xYsRd0gvG+_m$PxD)uJ5mb|Co zA?u?(0cSq3grIIUQ@QSD^H``_Yl9E#Eh{j*W8N(D{pr{19$n7g)$|>S0QAT!W~|4j zhxs`)r!Bb#GmtG|JFMOX2xe~79r~`8M5j>UWimkNljrhrE!1m zq-pIpE*)($RzS3xD78or1HP(iI#$_^F7Nii5-aG*$wXZqkWzlId)9l z_VeCjfA=-CnFI(06J0~Pr$&=L87?OD)W|gj6viSc^{4vpi=!ZB-j-WI5n#Pk=-6;e z4QXS%w7{$P@T-_})WjK`1C=fo0@b5;vZcgO;2A4eeOnw<$0gjt{e|fpA+Pf-v$E7c z^^Sqa>(ng4SDcbdDI@JJ0kQ2kr;%Y(ycdFZtk&;5`KvEJ9s}{%rk0F1<=vdK6!})Y8~$10-vTLp z+gx1t_yynCarKOY%qmu!kK%CZ;-*meB!QPsbK3EF>|y{>xV`|HYack9!ds|)F>^cv? zmbHQLLK5;EZC#PLE~U?hJ`(z2o7iF<I zHT1zCOYhO^Cy_$Z&Gw%p1g#9rV1B7*S9a)s&u^o2HxqW|IPe9KA*uEpvU-e1wB5{_ znWEIrZjLN+#DefM9M$DJCis$AB>)jNSd+YELU6u;8mPP7KKu*)iy?|I+0mri()? z&num^InAQ3VEu&>LhkcL5L^vVJ%o_E=25-Ranc(WMe10B@3M@AYiHvRZa0O$TfRoC zoK^YrZjTDWo`j!`;cVb2>8SGb5kr(Dh07E4)($gmwI|OHt*dPSW-SZ>LL7L}Wh;nA zYr-$~3 z_Tc6A+VcyQDnXxEVtojwRlyw$ZGKnLZT2qaLY7!c(TdL6M%Rw;tuF{aQKe;GtTA_m z7IHlxqQUIMrjK#TTH)MduQy6!~sboj*;iWX#ZIR-s zP1i%SCakBf?VH9i1v`XkC!fI0i+~;1GU^0!fDY+rer2_Fewd^Qg^YcliWSpQ1bZkrm8g)pjFArkE9(1 znxoyBzA<#v^p7;|jHympmkC4ml?uQOtRm=gj|DM7L4(wtEz2$&=8M)tf_7i(JsZQG zebWrIy@-h@l)x-Oz6ulP8A!Ri`H9ba({jXk1j_H6pfjNx2MMg@>5l3Yd4nx7_Vr5p zn*P3d$U{uDVFQbQwd$cxz*7r})S@m4mCFdE-pZLBH`yHzKRqkBqE<_zRpp^_2hNYo zAb}#EAyxUE$0wftuhrM81vc(19LpAspr^mLFXPRb$FiqRpk%GP!LxdiO&NwJ6T{ci zzV>r_o)TaC>l=(GSLAjTx0jjwE&oJhRr8GpPHY9*yrD8Taesy}J~<7XA55Ukn}yMu zz3u7Uows_Fd{Pc?2;CrzRcWs>k6*_>aY6tgZ7H5ju5!QhrP=(=SOL^@YvkM z7klmsC|Eo==!mc){P1x)19*L++b~wT+__qe6;#h*nft>!kJy3l{wBvlRJSBEV z2gOc%;Bl>guhJFKP`%{r9N(b;DiRlXR?IlBzGkAi`+~Xr?V_Qk6P*XZ623gr9gU2tYZPRXw~jRS$>LlLcR9@ zLm!ex4UKQ>)sN?h=a-x};0~OWJU0!u_?ctHj>mes5m%veQd?_4@5y^+H7`zj2hh9L z9D8p)N#Fima4C83Y8JD5C>k+SHuvS`!PH=K)5|F@9kS3$bQN7z_0zJQ7jrr$+ayliZ_y+wU?;DP^uo>e0yR1tZr) z^rmy^is+G+CgTqPIHSa04OsEeHW6d4q9@QW1~~cw_I^9gA#f^bCU!@Nv4suiN4-1Cq%5yKiECP@RO-uFPK2KQ?#O)?kDH z-t!B(ClOqsQLlsW>dtJY&Ya0Q4wtGc2GSfs0LDN;#ZkNbLAt-#uew!XyvqgDM8@7X zP)+KjWVwTqU2$j5K`>(q@h_f zWd6=GSnke13h6zvciJPC@PrSBb3h(6+@L`GVqUF=HgBHnEcT1}`-q@%EzS7Kyyd6k z*cFwh_Er_r@a_#>5s-N`#F`r&{H#U|nB*c$a;1GQRZhWFE=6B}j6e zbsy1mH!HPtm=E{Ha~u0l{67qQY zmDGl>j-@pldsCbWZtrK?zdp>#UhIg7?S1^>n)A)Hgot_D@34dND(d&3I2!>7pg9+V za&ne5n%xF+wd1hNi5g=ll}yE(7T;ns`94ScXBMv^W2$5ZI1Vp6qe`Jis~tJJ6Y}`Qnl>+R~g|P^I0bJ7`b5*Y@QZEX}oDLh)xZ24`?$+~}qz;%yL4XilpR?DLaf^OG=k0~YktLSc#-N*&JMga`_C2_o;n$mEf z0-$+xJLS5si%eI4TNF-nOt`!%_F$P@<)8h@4Z1^n!Q0=gN5feEhQ_<7&c<%S{bn}T zd->jOdK=f$QATsO{lh&|d`DseN`D7Qyxz~!`sgN#Awm~E>-}G#XjWTQlK9@BgowS; zGaDV@B7NGlT*g|RofGDv!ly4Iusl0{Zkz|LRUH#j*A=g;QPt0S!{mJI`x>x@R^ z$!DjYZgIx+W;RI_8`eTbF9Sh3ojd-(voNfgHkCwwrXncXck#9UHnLn5t;=RRmal}s z^-7QE<)R1Q81gun560p8W}W;n)S9Ya928x?_j=z$59r7-X$=Ib%V(tlc90O@$G9W% zU3E3GHKxp&Jwi0(;xG4$Q!hEEOT&s#d=v{7n@` zb)e_{!a~;s#?ff6^9yR4NPg3_nNeKd?!d~&=n4FR>A;)gewIlM2jP3zuW`Eo2Qn$N zav!%2_foJkY~5trnFtJ2A{7WPk5L_~nt(((SsjQ!+MW)6x4?(__ulRiX}-`iRj#m> z6s_n{nQ!6lJ(@h;HCx~*5e+!CpGs-1U*-nR%-Z8^gVPTiu~y__P2bf4(GPh63FOjKqKIsO#8Qhh$L-Ke=grhONUUDJh|BIiL4c-H9B>B z+2KknZa8i3;(fuuaED@O_wcqx4D*<}IimVeJ88K`^Db`m{fXUuR0y2>6O!_~_x;|c zDETsXzLBfC9Bf(G;NEq15aJ|x;}~#pd<3pBiR3 zwJ(njr7gu_h$I*4llV7iVlACt?(7X$4<7zW5A0!ycC13Dd)eM?{p0P`4y9wJhQ*Ka zuD?gXo=m~e6J8_C;2jGCc%q`fuwGGdp1b;2oAU^J6UR4>E_K?1zs5|oZtBhUfsz9Q zf6gGUT>z=`r|XwwrQ5Dnmj-vHI6*ZWCiI&usf|;A3ns=CTt71dNoPNBqR|@0yRU&f z`v>p98~uTr_k<4{w9R;-@FDxc=~IKkUCHDyMZtzoRs@#65+TaYZco~Cw+1)kSa-7VKm}FvQJ|=ZyFs zR;!lRTM;HPds-17yOxuuvwT{<<2^iFiMZhgqYF+F6WW8i4cY{QOm-<71hkT5xK47ApP*heaa~M zJh&`O`F>-il~w>1yN%zq>8kG#`R3ZSn^MlR;~e2#qFZN)-2YHN`B(>+qX3&J3w^&x z0LU2>vTb-GhjH7r4;phb{H8_PUQ59>(+QCFTgtE`J#PZcmUTzqI$~u+3U5&{`6M=X zgS#OxYFB?ZwD~-+$NcQ88Q&o+G3TXk=QV|!t&GpmR5_v5l?SMeQEs@U4d&=Wt)z&o{- z2T3RxS=IUspdm<`^D}C1gC^BAAxd@qfO^|8_`fqx-|LSx?7PZzMdf2mljHu7XQ=|4 z$fynav&0a$^BHMOLoGE=fg&e^J%Th1)W08_Fb-&XnosK5UiR&^_r+5ihl(Y91j?@h zCW^?x;GPOu%Zy?Y6g|DwA!1Z|)1p#(T;S!7tT+MIl7*B-DDCyGaYLT2p&`ZS<|y?T zJ8i4kAMB%@+tkaperBid9dTn)mp^R6;_H-lfdr+@_6Mi@!Z}Sq6n8&K)^LDe@rv6v zZO&HPeoxH$emuj!5?!|UO2s6*$A@v4bw}~Psmj}?4HmWA$fmwazpbycRq{f-HP=b^ zfk5Eyi#6*P=W1K4?Wxs{D@ULMfEd978SD#;kVsQ6#MIUZ7c6vI&+*(98O5Oesl-B_ zw-P&})iXvW7g^&0%C+fH&S(g2`9f0f`jg@h;EJ6Yx%6YBkrazuAxeFlqU1LTA_U|C zFfHjJnVxS1oB4E)ih2Vnkh))0xtjG2O&))hR$}k26njaY$-EN8SdllFoJNHXk1*u@ljhpUp(S z?vNLD%YWC986s}DpL4m^e?rcA68Hn1IvC)7`fQA{0AYR_1)4vzHXD%w*S;j=6$$MSaUM4;;{jz&Xn8W8lR(?&me=KPf1X$9y zfN66$jB}c2y7=_OD>@!Gj*F79K{o{N(hZLd6!pZxwx!MQ2~nq&iK+c1^KB#1dU^!<)nEwsY)pvNu$urMpzYR7`S8kV}0XV z44kam&vm?CaH#Ku?;r$IK3Lj~>==t>p5F{9sGcK>S(W(-JaY!DOk4rva?A?i{Id1R zdzuGeC<*axy$p3QcI8MUiwZ=vsuP;9#u@7%|K4r5cWWVeF-@p51NnVb0{3fPqdFU*|w0z7b-22G|?+oyomo!Dij`1-3R+1iKQ8;d$k1y(53V{3FlT*xP@} zq>{!SRF4T>Mh|nG@5<4h==o=(1P<{f;aCf*i{{{i9b#;co z#+Px;-qnI%qs#%|g%B2l^;+2+sI8@`2bkmC*p}P=(R;gW+p+6+&PQAiBw%)+U;rrLBvLxf<}y_xwf( zlrMXht!bcFC0pSMRPtSG^=pKBxjKz??hcoBq4`+7iL9+6TV*`-9gZNY_5iVoMSU97 zOQcA#cl{78j=T5a+dg?&XN5>Dyiy=1P=4WL8*quC~KbJCw96SP70T#)NwC)FWOu2bd-~w82IKAO5<#$J7SJk%l6E<=1-4){<-)Ut~VvvP+0QaL>kr5 z5H+JBPEnrOSy6D^dDlwHHLF97dM924RiE4sL8JaK@BYRdl#?k(0)G1IHJzz;9w^@*jyKI+9Vt$ve*@_g#6#R}fXReY1%>>H99^sAX*2 zgOtCcl_x*~@LSd24dV0}z=!Qje;j3I&R(rEP@9;5XJmHNGhQdc#uOn?-NR7^ddvJ9 zn!abQ^zCZydqKiy4UKV$GH7VD3&WDkJ?xgB`V#Lnxxk>YI|g#;goSldcR(?Mn&uV) zc}V*{y~k9w{h>ic#E{#e!lzzR_@+U*dE{Y#miaRd)+>hOB*N@>l9M{ZA(6#9fIRv` z@shc1%8EXPxq}>%JZTmMmFoYEqIhEjm2xMtW{JpPe! zkJ)FbjU}V^)dZ;^kf^*JPsiGNw#)f%!=66Eq25HgtfTtQQO8@VVnt|gg(&#HvEA|l z?NPGjc2VtT|MTVC(wn*AeEMfKvi6AR`@xbzfp;(52uSZIS;(zLXm9&D8wJ!bzU1uL`*0 zlKf%bUhe3xvsE@Hq9++>)(HL*f^3=~P7DpLX&S9)=`)s`(8=an#Thn?fNo#e;8vlG z8gSR-WVv3Wdq`3?Ka)@FZ8YV^`mc3a_hc?s2P=DXJx({;Zj`PzpDV|9`0uWm5FCq+ zWzS29*v_%`QyWe$W!7#_(Nj1kLf30BLY}D7$Tzf?zdsUc`Po9rqOa#vHgdi zD?^)SVRFLmHF+->U;#DxUkT4uvH%{``k_$NQEQ9^Lj!^lZ62^xZB>mcl|hjc{&ns1 zkD4d2uBTUtpoLqZO0msTiF6<0sfHQM;U=pC;6BQqEvS9YRU^U3#s)-V+3%o6Y^N)0 zi0dlBKcnJx&C&a($SQPsZsVkk=|tL5OhFT}V6qQ!ALfn#)?Y3C$EA!jxO&yf108Uj zKlUM#`{kL4V!AiW_BZeCq)*Fu!Bjl)SKb|s44AkNUVn^W*@0t+{~YAm>ui;O7lBlY zww=SRI9n_+1>k)PCVvUNEHh^O#RVvSwRDaQf$yDyCFeqG!2)Rq;IVQZewu5OI3p`DfyIZ z3IgT-V^CA51?;u^++T*pkTZ%j+YqI(*S(G^2xgE|fHTv8UvvN2XT>?FF}kt>kp&v_)?ZFwN`@l(>1|d`93?t{>5t}I!Jf`|@(}%` zEV#A$0xMKv(4CLoo)L|0X^#0SNLNXR6Ca3qyox zTiG_$YVA~r(|JgPtG7P4Speo2aDaRZaQ92Y#jc!S7dtg~>582q4|c?0X;`vPT7YcM z5MR?%SOwIpKXV{Qgj1mW(MkN4liWl|g3!6VDu>H>g7nM#dN}&xP9AnF`a^5)=Ig)yb5dr_^b4r;H^mmToMuD1e(lG3ZV?lvpUzV|;Q3u!a#y z!x!@+fv`2P%;RpehB=L&L+m23KNYVp8S~@olQP^l9d}?p6rQfVMs-OzbV*pcVbiQh zlNd~m!$}5KKeS8>5uys+`lK6Z?l@wF{~E?qXBnV$s4({EI@pZ~I6gR65BEysal#{o zK)wrWy(f&h05-TeS<|PJWUa=@_s+EO3avV~^h2Wjn5J)!ec!Iyz5_s9Gn6QGB^1O?a1(z(`8ld(FA014+xd!iaqul(m#o879csM{kKy=sH))EpZN%gZin zN9EAq?(A<-5ljT3gXOUissqG{lPo1)8H>!_xjFEru($s!`GA(mY8GFHK1wo6>JDq3 z1w8xMA*8E?Efp_4m1(3D`|SJ;4K@MpWmhy3tt}pwj0&g8*U9Dn3C>Y@R}Ax2Oad7Y^7mhvt3741srXwYLRcBp^riO7^{t zl|`jYPrpvN5}eu#eP7l2OU}l%h2~Oqx5M-oZy)DI@df;~55BwMt}Gzhwz@VT9ZEh~ z+U9&`^(oNk=v+Ll>(FRotxd1&Mu?F?dFqm#a}7+z>k3mFetp*f-X&tyfl?!F7XBcR zXW;0}-0u_D?l~boL1UASZB=2D8u-N7@p)WHgHr&JBD&9OEAze4Gql;{WRAto&a&G8 zbWut%-q#HT%(!ww)0=-w>cEy^$J~hCE(*t&8vFgaQB5fmP!S*YO8fO@*d*z)~!_dy9^MXjcUwq>;CYGvcpk0&V{m zXCA+<+|AXM5i)js+ogN{yv94FJ2C?!1Nu6Ni=!*asO#U(bt20beg7tl*k5~+J>yvbr@9d4kSMp8k zeT$B|Kg)X4{EH^mc!bS{nSv3(?f)7{JV(CJaxeC8*W44o`9Vf*p_QoS+NY}7PvE4B zNCLhyJ%u4Pl5laxUv}g}_3t&L6}o583cFSI>g7JE0sA=NQ3IsrVD4CRDH23^7F)h-rr*RQrqSoY1@%RC*V3vN;Tfzqs zblkCrHjk^uUG(?CV=W~N8*OPt&j~G8D-frq0D!(xb`JeNhYF<6bRbk^hmr(0-QDCK zfnX!PQ-eyexlIL65@Xs#Dgt{Q6sDCwg+u9SOMgh-cd?B1?J+ zrn#o)Kc`<}KaN4RDc+qzp9{`b$S0J^dSf!KO|qE^H6X+*FO403P>ilP#iv0^8!Qm^ zl#rcFZXPC8?URlSgkHg{CDK)`uK?l|>QBVnXWjccXBAkXl=6@movATL3eD&g@75fB zok1FA|Dc%(c{*A6qZ>gDU(_UWIWQ>3R9qlBQ#VyZ9~l#F%Lr2Y9f;gij_U0HO3n;AO>e3BK(NrM~%=H+};%STJv1D)&|W0SDI@B`*!K_cnyJ{lVZ#~)^o zYY`5N)2gd(%Vi8+bOw2cS0W{zV!yx=Hsi%h@g8XwWveT$|u&V34ug9_q zp9qISN?^<7m1;00Q<{(*-5Im<(FElH+c)s;YuADcXK4=m1bMc+sm{B*Cf%>F3w2^%?3LCN9<}JkPbl zh>kg$4=k-9x{?=5S%Q;gUs>LFZ`eBDR-Sa3l7Or2)Hp)*&pyfebW)caK0gdGq+W$g z$)Ez~wkCP#vrRT%Nq9~T)=+I3qx#&92}`WAb`l@Ou(WU}+5r)PGt0tYlBJ!Bg?W%=dAePU!6#KeaL^;-6P{pK zqgCN+(8*7B*(y^uXqPt&GDfI^k-##gzr4XjhJznX90zf$!j$1ZOYxGd=UmH-HB+Gl z!pAT#oPHkGeuRrDYk0@!Smo!)!GQ^1L*{B&vlKvOzhKV2!Y2aYn{})8Z5RtqQdLG+ z`G&T6{V^*9hU3G^7#n_g!egf+;R8_2;JZGOU zc=ZI*_;D_9FNjDVaD5R-jrelJKE; z7;)PMNSBX8`!7x#FXp9wKnF9&p&}Rn%?`NhOUaO!g$^QU54k|VPd~X56gUL zj;l$MFCvO`g+veV#>F+GULN_e^w_QS%ecXWK7ReDQ@!GQ=SZ6AB z7nvz3G?vpdac8r5n0_*kYsVo0L!>>I>z@|lvGno=^di6|bN}vesv}t9s-LZK{%&$* z43+{yB%B?Il{!O<-jW^*Z+KqkQ|Tt|vnl;tY2>P&SdP(|Nsa^S!CK@Xhc@S0oQ4Cg zF}W<`CSe;Hu<&W1dw4T8{6%B z+Mnjq{l0n&ig6_>g4;_+^pv}&r0Iazu-PQyD0#WiO%}X->EngKUZ4Ky;0!gRIh&zO zGBiHb2p39qDodTt^$h!`lFj2TsQ|Xq8hr2%FjHreq}fQAyO~<>?_ zvNRy_M_6#|dHs!$uKNy32MfIeGHycF#<&xvQd&XY-R%xgo9o!9apWRlHTHs9--LK~ zlMhU7AV-i9d+oSHOO9ZItcrx+-=dK;b5+KS5`|KQ{0X%4N<-DbrW6aLYV!Dy<)zp7 znczC0l59=<^}e@U7i!|@_gvueP*LnEpZm|+3Vzk}JZrYmznq#hsPqx z3N6{*6vvh786>1?U+V?l{_~7qk@%vc$<=$Dk}0BP(V7_a=MnjcH)!OFd$by1R%qOn zFSrD#-01|>FseXl$AI(9v(rvpe9}ke+1cVo-1ZOY14x{@AmY_QLNik> zG(mOO(Vj&4d6DFrv=e(#lTzmZ$85PSC_cm7${64skr}z>`mS$y_pRuPw&wq2YM%w) zAqRHj-0VZs<(HNlgo8`gv=OvL>fnu+r(=U*u|*XB2z^<&>-M`gj)5V;!9S0?^u$C% zqIrq&R>FZgzKx|%3x=&ozRC>s!M;atr7 z15wRcFOQ-fD->pC9`yg(Q*QoT3x4OFe9qOWAn7Jy0vd|pqP6kUs>COZ6ipAQ^+{U! z;$dJ!snQiY-mK1!p}x%(&drVy=}?3jzJtgC=P)ks=$d(l(7m{M$m z)ICD=H6`~Fmo3nWrsVoZAa|s`hbLoNYrQpl-qfPC{#O~HE#rE6^^vgz;#pDjFM8he zH+)9g*?~6lOYHdlb8KsIByyaq>}Fm^hoyI0z!KARILExOx$Mde(q&2!c2A;rGwNB|4}x5CupHW1&Bf3Yijil5elu2Fw5#Y3~7(kc%2 z%#2)(N)05NWJWVQyEfeOy~xor{=8%lX?D85BohoR?(NQ%;z@F#TnA{=lad-t^gPeb z+;rXJZxf9UWDV2RGtULX$!>>T)*R<`z~y0WSg^D{q#*Mwr7@;)P545?W?WNhw6L}# z;p(B-@cko4humfR-H~h6TO3>UVV|%isqt$>Ip{*wki&saWT|~LwJ z+e?f#ii<(uhJ_T{;{oU}k;Xh;ZQMlLre`hL_ro=Z*b9CUhGqVdfz?+BZ?E}J!nJrk zT@du%F7|zaT3d~YtCaycpK|2{o<*PN|8!y3oHpZ-^e$U!Fnr?hv{Pb#}A z)r2}+82z`et#6i@5r8XPyVl){OcQ(oML8Y_oxttS~D=rJBIcGZRstRy$5XQ86aXKX+bPeQXZzFTJc+M$4M#mrUsBv_L$7xk%^_v%_Hb=Nqf((N=Pe=s zW=iia{b=uQ0xJ^#8d7ue#Z8K;<;ppg>?-FJE}&FaQStZS&nKX8Y51$bc>9}joZGY? zVvAvyK9;Jhns+g{R&^&IitZZ@z(2bgXPGZoZ8uzP?f3xu-EUj%fNa+DWE-*NlYBCk zNG9KiHC#Q_s0Z!?h#bTT^_->wYgAO763U-hxvC_UP8Y@s5Rk^FUzQ+*LpYuB-M=+q zeJGzO*8}5jzZ|o8=x}uT?Qit{PX_gz>&-ig?(l{CTrqM<_x(^wRKRQI6U}-0Uync5 z7)@Xnc%}^;hF+T~G;ZzW8vAs3FkSqoXE?>XLh zUTNi0_|b08Ru_kDtlBk4s=Mb=zjX(89kubTflq+zTfmI4F&_>UT^oBd6~+S8TF(q& z(kbUnS;G&7tPvgTEnE@lTch3dPJmz7p0Np;`J$;`u_SoYw&eG7`+_(1&)sfEKV09H z6ii9dl!iILN~wl*pV>ihpy~-FCM2LF{#F?%=J^1^)#DQy7{ID`-^@hQLuh>xl~{w{ z|5;6q&9TY7ml2LP5ezn>Mi3n@mwto`O9j9 zhBMGH&E#*7y~CQ#0qetrRgug9$UD6Yh6J|;QY7MPZ}cfM%slJX=5JAfs0SgKUJn5( zI8yjy(cUMn{cP$=iaw9Wu4}2{$^+e%H^l>T_+>}A#NJ&nLF@vk`h;D9#(bt2s|Tf1 zC7y|RB>x%)X%x|Nm*}{cq^q5EwzFRhX=utCATV+}RogpWQGsGxkE%N#O2afqgH~$2 z^Zjc&DKmJ#k&xrQzbi?Ee2dn;Y3kaqz@RjDo7ldKxAOT#GN30pZeIU8i3EuCJ25(6 z{l&g_kco5)V$V0bd&-PCl@8|Ly zxoh!3N7cW{b23JGX|L6`x4v7xdhX z+1p&fuI$w-Rq-mt?0-2wy!TBdEzq12dL_Iy(QZfJtG4Qn=XjA}sy-tcSh*NTKq#3E{X!(k>9g9U(~0P;?u5v7~# zk&Gt#{j?(N-+_y~Q?tb=O-qv$2>6DBJu(A zbglG_+Rs?2f=s?-7wKz{&DDrpVdoa>-SCzVw_rPfM*+fm9U(4Z68IX5_7u74r#vVo zeCpk6vc{!8Nx#M;wzg+QM%{(I&`{w7(Tt-#oXc8_+5Y@c#7?S2Nz=|yul}~obvTFt zHgh9l+V^QUZYAxhnJCrkAV4{gH8=F#V(AIrjNpRqo2v%}%gAwlYv-|0qtx#F#L;SE431=rG^#=?$l^DflA!R$?IntN*c^Fkd=wO%j7-Nib?b8zqOCxA-Gu6 zUei{r7c-AUh~%n3C*ZiNU!CBesF@6Mh*js_g^uWn)?oL*`=NdKq18(M#3aq#OU zgV*qy5EasmJTq&2H#}TGn|sjkpakEk!qHY#t)Zj({r^z)-tlaQ-`hBm5~XHq)QDNM zHQU;IE2T#5)uMK(O~h7|+M}(#sU1Sq?y~pZT54}1BEs*T@AG{=pXc{aU;b*6`#$43 z*SXHQy<$YoTxk=yJG?VLL>`F2WBTAGTe9`ETec@64-#CI?M5}sx#-j04kCt@>laF9 zWkY3@0dvA@9^N=Up3HciJPmrmZ~RaL3}aPLfrrXMUg{7e?3V3HQafbtdotU zlOZy`I_*%)q5?ZNgV`o5lcyL$knQSSfAqNq6uCVm*knQ=3*Y_NThQ#li zy2*k&qzLJkFF%J(J!fayVEfQXM5i{x_>!o-VTfOjCqK47y=mtCl#apK*u}?Sv$Lpc zj}9M{N}RA?f1fCjn&y9t_r#`A_lRCzAD%n1Zb3wP-mr&EYLh+`jrUD z)JA;Pwp=605}8qQh2fdE+KaCm`<~UYBTN)s%`F_sHNC4?<7!{de;M@d5H0IJR_|zF zEeE=bkkD@6Ka%;a%xx4ezo%>1pTYQ)YGqX0C&^av^=Y~F)H-)R45FCeGQ~6NCr@0& z%b`q3gIa(vp$u6y{W=u>etpgM?EA)(=Jr7UVYqAXW*s;1)j^W<3cf-wnaAB(&LH!p)E@kGB1r8v( zHHm-O))xciO#I0S{lRn+YP(OG-z4|1{kAReYg|9nCS{K`To5#y)hAJZHq=s$>xVE^ zU1=xP@9>+Y)b>9axNXPnKY=CtcERyZO$9xTZ&D%?@-BlTI(HJDTGF+mjNcFus<_I_ zx3!gOrO(MLGj6V)=G&I4QYnBgHAwc}&*f_o{O>M+rV>xrLvW;{b4${Kx!xmsvh#)~ zOrCFxugqNvkM3H~Rng9?RxS0t_U~AF>MS$QBQg(^9{<5i6x1v9B0)2yQzPFdOl;N7Y@%d!EG&7&=i%^K+^(?G`-}8z zdGMuUR7T9cD?t-Ry|LJ(`a|=@;SrtdX?zv;J5lI|moH}PhR$-Z~p-$rI14znV_dSH+T%r3G^T7a(WaKK<1y|OtHFf z{#rH3Mwj?2W{V4<>EGt?^SV1sKO?pv9RS3Bs|on2 zT(ucCmVzxtn%jY}?6jv;S=7>DRAi2v*mtVKK%Ln>W924gb&At`>g3jIk3emJA0^}0E?v> zM;n0{ARTiGvguk;>n>Tj{560#&(+LL?vpzUeq&F~C1H(53a@4Hg zI@E0WHcz{FJM*e<+dlOksmc~mTwkh=4iP$>W+j@cEy(_CUd}43yjE272qD0E%{k9t zS0Q>ms?C*B^`r;u9fOdd-`&EsNv$Ruol^gZ^QU{Dt)0K1n>pt+@?%jtgT;x0cUK@zNHJRJMpU$?x;d* z4a{BPx~>dKQ9JoYI~o6r;RdzozM;t|{+Tk=bmP_uzwyN3&^GMyZfN9z*)W`p0{JBR zjE%O+relhosW;yoNDTNc^c!#6$r>V%r)U5eyqN(~a;Dm5iPr^>(THUZU-qgiYRV6} zdL|Y|@GBIR>`b0DegP?e5EBO6lG;8T}cI(w#BQS-ra`fZU!OL<$>0We4lJ z>UwJ9FPPKpWZefiS*JT(By@u|{f51KJ_`MjCR_%2}B#nkDzK{g?8o2Vs& zWOb45i7?%pL56R%mxy&UbDcc@C)~jB{~ojF$P{Ck2d`(I!uX~ijr%;)xEYGYf4%nK zW^H@Q1f`+Nt#Y`Pa%&A1k1NH)Owa9=y)8?KIVXskbnRP@x^@5O7S)Gq^;E`8z~>^V zjbIg=RBaDsHw4*~BPg=pgJ`vxp2u6$O`=1DH`e~L2KM~^Ws^lsCTMiGM#3i4XMH=N zw(bs8B&+^tU=4SU!8$?t( z6hx0x?5JOJKP)$Ts(DcbcTS7FjB?|KK5efT7(3{?s?a4)W+_Fk2QILiNWMd1_FeCc%cO$#@h+E(ldVNt!*HuO|qQf zF~9SD&7ED%&Dy#tcNT4qBliui=Pr1I|2v9Zq1Z{=;xLZ39r3L-Jotx$YXtw~w1&QS2j9)gK=qF=Nh;6!|kxj1!E*P2jcP7g;08&IV=$Kpd=7v6)FN4<*Q<94t!C6{paC z=UxvM*f-OT+Wr`m8CtM(01+YT9`QhFEN6jJQ^`_>vb&?8ZQo;%s%r z=#}P-0Er4-yJ`k~i8=@&SRU^WQ+=RCU7qP&kKBVL#vY<@Z<3BA&w_5@T(tA{Du*uo z5-{W$&8yxC#$SdNJArPB{pjunEA+>4mKoJCR>75k1F+m-FiSnXqdA6yj+H+oMs{^IR# zYRugdd=W2TNZL#g}m#_b_i0@@! zJ(~Z5Gc@~=?;nzl1NB^6&Hrkanc@jRxGd-Rt5VtPN3a6as;@c@1;-w59wQR#?ev#2 zK97@}`vLjHbr===20LBiw(&U^_OXA~4plk8jitOs1?8~Z`geerBf%K#P;VJP5KGw^ z6hoANK#8FkS)Aee(uwC$hwr5-y5q5Zp+x-IMrH2kReuiER}y^L{xWs4n-&zPbFkMH zGpA9;9kA4)v?iTLou+|k*!u7s0`9LMj(@B>t*Ky@6~wx z*OMgJM>j}KJ{89LR0ci%Ez@qE^6=urm3DTEq1<=Ui=OcVN( zwt=h~{aI^}o1ArFiT;imDQsp~;KFjeCfmUNY$IK5r|jJeoy^)|^hp3!%I<%>)QkN& zna|^QD-MFhFNvQ`Am<8LX5>fm`O|@d0A)5Gnsp%OUGFh5ePLHu*yjAq8IHm^ZNW&* zW@5KtxWk}X>{y_{qzRKryV3Gl?2P}hy&b~mg#dV;5r6coIH^6UCel|eJYewqaPd|%?+Pj zXxt;UbPcjSxhbn<@kk#vaCwTS^P~~_DE_WzS{25S1!>e$UY;8Ey5vz)D@km5D81~^Xm&-gj;o-G2cr2Cb!YR5N4)IDJ!R3Ia6pXrp8=pKHtX;|RN*jA>hjnyQ!cT-C~6;BOJThV!SdnJ$VG_@ zPp_thGqa~5Zh1pBp$=Ct#;>=U%UZqn6s-<6T&+Ppk+FDqEW9~+SWLYF3(%!vzvcMsb5_l;NTp;e;bDssve9qg}XABY}=m<{8dc8 zTUGkm3Xp3l<^ciDk`X$&Lhd~}PnZ%H_*jF86~BSRZ~Z!W7KN_1mW zd$Nf^<%Gn?th#Kt>G(X^S;$ngbAYx}z50d{AO(TpX%bd73-}w=PLkJ9>p*z@pEfoZ z1-Y9mRX!Y`sV`*B>dQ1K$yE|Xj`44LOZlhX25y`(emn2@_X=hyde>Qyc5(Pf3L#cp z*|;BwOBDr{8oa@?v1TkLs0v0xCIYz7U|7kMHz-%knE&|{Z3KLI#me9{b|8grIb(P( zCH~-}`(67z+r}!b^o~@4%VvXl#-+erjmiRHm2Cbd8?83(@p5OdtXlhp$h_ETIEr@~ z>#rGK>0(6$7|OKJ)8n_o0K{WuvJP3nagSMYDEKGVjQxxG&Ws>7^E}lI(yrp9c!D#O z(8+W15qxogUF~KJ!qjbNKWP6@S(EX7pvFw+QY0Af$Nx8k)&b26=8C7VQ0j=%C(++? zdFAU}oS-wqta9s{=B62Y(_`cbm94KSQO?`RUjE4>a!#I+o;ML+ci|e-XhA1z@vpPs zwn4gQ7Y?{Lqd@KX6)!b;^VVRpv_gS^kniR@laPx%nEAyLjxR@WXX`SRZO$e*es`yZ zr#zrs;Dw~2)+DaA^!j+;EcbeL;?m4laO|6=!AuaB zI&)MvHsTvPhH9!oRqqI(%OdJ1Vij>o6_Nn*&p9)*@?_220*UE&{mYS3X^*@1nHN7> zWt6#X>BMTSW6c-&lqXW8&ka9kW(_w|ew^oKdEk7aJKreVf5P>s0xy9O!}}C4`?!2N zwA_~e$>#k6wrGNnHyWlom+o&YH23WBXjO>1z0X8Um&L}99%#C>>ThUNutpd0cxBDc zF1X#@)y^-Tep@OIq;w&n!@aax9K!cI5szYY_j8 z<#+x$ZyWqkTcWtA8elvGA#s*F=&;NS|8U4e*wZOH;)f-Pu^_V&xBkKqm!0}cgSLUC zERU?R%UD8*6HznL>FfQT+b&oUH>nnA)%=*w#n_mYCUKRe!O%sy<4%@iS|PMbf!mbR z2Uy9%H#qfhcN5o2ZTz88%Q=51cYD#+lDFawrnDZR|G;ZciLTt4MEeyS)(mezHZq z(R9PFA&$ki;HZAR05e`-@A@za?L1hm)UdIWai|~)1UCF|#vUi{HN8R}-Sa?eWwu2{ zYcNAPIFu_@fQpPJCfVG;mv6Br1IAmw+IOY;GtpaJqLKe3B!D{K*1~OjS|g!-`d4`& zkI$&2$|u(OGdBKNGeFXQFr{XUb5;#WaLa!#Md&DMO5M;kzy83f)QR|T7a-!m+V4`E z9l^k=sgs`Y5dRnBD9NupUCKeX-=6-YY{W?pP7&IAlZL|Zg_Wh6B~F|Aue-W zXub{&DG?Q)lU%EpA7C>dLp4_8+TTqg(FZhFo~*Nt5~YY{l3DfPIr(t^GbIhw#`lgavWH;SHjE!YG&e6WGLubHvg+CZL7M?^F^=~jpg_jL%Eg~eD#@987s~2(yd&8$6Uy5~mgqu5vwsOD z_g;|6$TSWDlM*uc`yVc>X^(<5NVg-qAgV6%$KEeFjSP%;5~`ZSC%!@2STUd5swS|q z&$dc`O{^EnUYv1!a=u@WJAyZPPfze*?t=yJs};FNjpmKQJF9@T%z~LsMEYdaBNe^I zFjtJx-Jhnm8~`@3t|-B(PFVXg9=UXhGKoFzlbqY}DbmmXwal8b|25UcH5VK{4{ggUE(oB#A^H#bIW~+kcUg)^u(@^^YMy z(?`o}gV4oT#?7-Ao9+X*a>kjCSpi!;rtxhOWL)Z{IdD)0rYs?rnj`ObpN%5BhSpzR zV@{?EUMC|&^3_uf0^fpJ6XwTD59FAzbJ8KLZM)K+zfn}S6(678y4uFI7C%p4bjBO^ zoZ9m%!7%xLSU~LKz}KhJAy{iIU8bM#kkU9k_UDRukE2Z27d7W?Sj{pn4YC2c5eM8f z%I4lJ_L1mL30-Fc$>>?yJKM9?0|;F{mzrlZf}`uat^2*&q6Z=%@qfZs{mp3m15!iO z3rHni|(m(esozNu(H z{%eGDqWcN4Uc8Cy3Hq)Kz^L&5SNW2Yz&iNh-i$m0A2HbX{K=v;pWdJ6&n0KyJ(A>Y#nnxgUJvBd;@YNJjcU0@ zUQSj&H$r@B#3ZHs6SBdow<>n!C4My>0M*qO=);)%4gdD||2`dX`tus3(6AHc{Ep8Q zfr?D0ggTwN&eJFYLWY*?=$zM~RJ?45hkNtWihN92Y%4^!x8WuyFiRQ2425jV3s|~X zNmWF|PhM^XU099-2CKgD-R{>F@;o?|-I9N?&Q&x)%`16UioP20kWC0LA*->Jk0B!;ic*QE-^$| znVwXIl09ZO!mb2Ye^Gg<#rw6HPUb5s##Dl|LFNq$Wjs{hnFy1TJ=Ms+b@KaC#+E52 z-w3s{E`RqHd&AC9%6GL!12%9(CnJEF?AzNC)3ut~ z#<@0lJDeP}y?zQsFm{#xd}*0FS4sVIso9d_-D}rb?`|X{7d4a439y@MfK&XNDN}_o zQ;Ey8e`sGBVVdF4(hNl!G&Q}rxxm*ILV2epDbs{8hISkn?y@oyJmI|G)IJ-?m6`Tz zGF)a;nD02cb3OxfVWS^=W4mD`6`vDUT|8JcP50ubK!m_C3Dry6lez%jPEpvr5?ymiL6o z1UX4w0qIUL)qoew3Y0Nu2+bXQn=xx?d|vK-_C*j=*uAiV4hA6;%bV4y{ zDBX(K5InG)$89FG2BR~UukP|cDNaG1?Okf7o#nLd_1ZwsY}p^<#L=uI5ylW^ z!^ai?hb6GxTwJ0Rb>{4&?^Tl*;b3ZvU_lFL4?TOjUS@|_t19kYE`?Qr>= zB(5p)R5@}j%5C&$sc|$p_lr?I%Ph(ckbKn-2e_sDQ`hu19NM@}@RiB(NDn-Ef7SbMvixlOl*z5*I_b?}4hWl(Yg-->ln%9#gWsL~(AR3Y19!Z9No2z^n7zq0 zGOQb{llzd}mQg=wN8&Rqk&mXU@9rz6r;#C4et5MvA=$qO`9~lXMS5cec^7V%(2M-& zE@-I4w}KFDlWo-i{XPy@Fp8|h5goaFtRhv^W@PKe$Hec7Om0X{usRpBdIj{_li#e_ z#OfqjPQ@eX@t-P`9J^}|PDE5DKwiFejoGADELP0J6I`#$xOl-HV1}1ygh~Pl(L0Wd9sC}0p7-MRl93*3*O(P~ zk*);v#>KaESmP{*SxWirm&xhfril|44PXs)>ZbxCi_N3V{D#TTXRq{<6Vyj3v1C>a zSZBG{*S|g+M&0x%ZsbHd3Vy<^!@s9w1z>WZ?vG6ji96`~AtJ z72)$yajyU(?{bzImBZ^WPEuapak2#}tLv=}bB=@S$)#68*#N z$nGu=6le7zDj!`!lo&zQr(ffaML&QX4GhN>;LnEV2y}@gF!?Z=Cy_;`GzD%r$K_UR ztK3C9%UF&xKg;>!(yHNQbQSuuVtP4kwq*M6*@2%f^bm{kPB7@!+JcWIpY*0&3EZK zu4nPu_dSJ+U4Y>IW$<2CcmyJiSyef3-*|eRL7VUT0*fw9-LDCqI6d_Hv=hqL-9san zEIWliRBKk?gH8@p&ayc}R$j-jtkfzzycsmRI-x%GJ$5DFCZhYjgu>!g+zp7TSJKL4 z&rOXHx$ET)L2l(FxS1+bql>oek4N``T^BNY>6ZeNcCPXp*B4DzId7)ai?}10A2?6P zXI{f4d%}4eFIRjI_}BxZg$8SzoPQ_FrrN-_>Z({?{EL)_0$&2|r(p`oqFPxs19LKU zK0TPt?%mUPwFL-P4JpjhTSrC1+PJ|FoA^jWx$m*LaxoXnnn)!!1yt7KUVqXtvsK;n zWBTgm*rM`#zIsd9wr8$(^=1F3jdQ;N4XQ^V9h^hEpCZIWZUew~(u{EzLn8BT>0QJE zfmDAZ(VE_*gzQ3;fT#MOYnVZ#IY?#Q?Wk0`L{d~F!bQflM9KEKZX{X8^dQf==i0cl zp~q57O<1#z!_1ZrUYnzyV`^<(lM>4BYZ|P!8dRD#6m1UGiKq6ith*h1fN*&K*C%yH z+11m-!>{PFB-AL4d^GUPLsAVs{FVR}r5KBpcw^^U0^|%7yLtfs~nsncbv+y~eSN>aTB7B*pW{yTl^2 zOmd2sv>zME4iDa$;lTXJvT1*8B|{qV!G&ceMShvG^-ErNqr6TA)knM#$ZNNV4@{x3 z3G88y8h`&V(c~ioGxftG@ic|;J|Q>K7;YynKix#tyaDZvKq@;aEdW7h1(-PDhHYK^ zYovk1KO^ewKWA^6f=0;%aO;^cg_kX*NS>=U56jS;J5-0Pz$`Sc3NRb+4e2Jo84*oz zy|)c%9}?53O9rHPqDJp_9czE`p3wl*KIuBBvuR9Lbl+q>Qwow z8@$_vlu%x@QKPIWB(JF$2Any5b9>s6ZWWb-A{&|c^EadmvJN7(h@;K5$k5Ls#kUVW zW-mQ?wDzS)|4RjRr767Er+f%KyPV-=BBsd0q1FH`=J)gSV3_TN*z_|Owsn`fRq~ZK z4tD}s$6-~sqfP!&sEHD4;POlOdL|?4Q+$e&Oyezi{UoYQfP|=_6^bDvOd#lh$9C89 z6VfZt@Nj-rKP<>I;o#D>(4QymeL$V0m)#wPP71E$EE$n{(SrW zYr+jWD>K_ls~)9pn)_A<-36)?oUeNPzfUxU!gM;Hzmv#>^F_*H{k8tuZ%Ej^e00L@ z1U>$L0S6F30S+WEkEc0YgyGLE6nH2ZQaOUagx8R*G;t7*pvTZSX6e-#|2v)SQOsq%vD0~)@KG%>3F*8 zx+BfLW?slr(ztLIF8e&5PbYaV(4M8=&kfhKS8G`g-2OPwNXdMc*$~mm2`;dzG1Df&Ejdd)W}q4{)QeoEe0eGWmept-<-xWNRya;0QQyHs3k2_9_@ zjBvE&+zHPp7Hnq`q+e9x*|Fgo7SW;LWJx^z+z?Q zqXkiJ%k}JCOE&maa3zyWBex{5vP&93Bnp~mthvItsA2GFt%mxc8Cm3cAb4J zY2&W0(xuo4191yR5JPU2<=N3ujo5_x~1`x!db<}-4yzi?c9&f1iNH}$BTN3C7< zTW-PX-b8KXq}lhst|#rkhUpmRfC=z@wy5HxA2E4Qw}v}uCNw^YZ&!Bv=>IoDdNPLMsmUYkHWGRJ8$j(1T zE2Og3IoL@wqoLuH<*K1?6kRT9xV*s$EfA^MIB=Gv&d&<-bi72+Dhv?H`9AfWM&Cl` zoSQHvcFytT?RB`B0dVCr09X70Hyr$-GpD!`0TAyO=v-~kJ)3YY*7El0RuVN~=%sN^ zacVc8j#ntv;ZYvi8JYPhc9P`eS*>G z;FZ%BSec*&n+Ds8U!cWZxrvkStFPnb`Z#DDGz!tp5nY_Kt0Z(%!=oiKHyUti+4wM= zj;Bl*&Fx+Q)%9VhKv*PUsv}o8qHHO5NP(hjjz%K&4+s09H$S0RN=#tDtm&@cj+0|= z_4Hm+V1SR4PhdyVs+$HI>Tt-$i)B5vqE^3j zi%x<|%Yd3}&;}IKx&J8mqMl`J?4LKFL&@;2lGJI3J~{h2xCVWCVqPQtP+{YjT(2wQ z_l4U@rC_n)QZnb}jHEN?gVJ_r@aBbxCNa)DOj?@)w;)B;u?Cmgtc9;R%d*A_FU3TtgTV1-K z7njZNMOpgZBs~%JyIxC6cmzv-{ZDYoum4k4ha+lld>M^cPIrfyA+d&)Rpw;PiY*iQ zf&G_9p2NA9vuf=QL_CA~I)wQ(ngFPL3s}X6AA0E#^3eoD&c@AxKMNm&^`O$O?kYk- z=P#3H^r~1YCOI|R3=5Pnyo2g=cFw5O`mNh66~lqO+U4;VqWrz~5gr2VZ8oMUJk-h^ z(u_ZQg#>blFPdW|WjPwGK2%p$iQr;0+CkiOp&}fL*PKf6~;qoc9AG>=+mM>OMfb& z6VOaz>BPuA$b+tg8ElO=PQG@(Ap0pA(lNn%sTtPUz_#5R)#1h=&1I-Xw#V|t^q-T@ z^Xr%pu&SNgRVo5$nR|Dw13L`=kw2(&{nkoPChfF{>b=iHZRJ|gk}|pEuDLA2y6!Ev z$5y0tP_lVUtmIPony?N_U>>`0LlLlPA1EgoVu6b?mbQBa$zl)5TPG@}479(A&7>)> zxUmslWm+pIdj2;B%iG%F4ob5~?_tsY62G>_WySf}1g_lZ&|sj(n0eM`X0h%p>V#_e z@i=7|V)t%*lvRU$5az)^t^f>=ywC`A!-RPG}g*CNm&jkZ3Q^* znn=XGwq2iD@x3muS!RLs%2rtbPJ5mtnOU=yALNKBca`?%J`e36udiGHt!NZ5GU-`z*}lH!Z1l^dUWFLfVY z(F*FY{*b&qwcYkA>QXBB*l53fN9XdwgUL;ltG8it{6PJTT37nj^_JXGzYp6e-)Lim zyIdm!dfb@ly1@TcFH~8gR9jgnGa*vHbN4hM0scX=4`Bal34l_AEaZL)pa8Sh5&Nu> zO;$$!bxPobd`3$qzi@#ar98OI^ioH*eJ2?Ac~J_@MdXM=*!HbgyoZHa`d@uCi*@Ze z?VH|Jy~1yDP8BN}U3Hs;FEa8C{GLb$mb^XI5s#Xo+gG?kVC+fRw8<$Gq9lCDN`u*g zeJpBait+S3!27sKmmqk7JPYY%3IFqHtsl54!&c9KI!0{UM8bUxwK@qJuJTdx?n%5t zx0Hus)s>$+oowh~EGV0|lLpNKO>9_6bCuyHr_m^`)?u&nlcC(>OrK>`cd$weMR0Wd z9`coDGpF#w535qwX*J@BC-uH6DH0yydS&^iqo01 zh+xv4<24P~PD$=!8Wo_dOLo-?JG3(z)W5V1&kZ_xlb# zUR1f^NcE)@{&|=3p+4c|2Rbq(fVx~}PiSzBQ&Gd^7s^1?n^4!bj-@$ z0p%-F#?BV|Qr{6a@kkfjqV>&XcE_YyG8$;flrmq(3k+>@{s|$)!DV@eH`*e2m;RtG z_*~@XuVFnM8nfShIdu0tS4LDl?mKKGbBEghbaM*j{}=fB@YO1|!{Au|y@<}zWutx@5`O=oE!*;((dSTU z$lFH>YctT8m#&x3tvJF@R}-hy*?P-9Wt7r(7P8aGF8pPh3*2?yklQ|;q2mRHpZkG| zxk>uBlL91*bvY;K^G{k~T5(dNankH2B0GIUPQqnOR7V5$=dEWAiHyllbkg73?y66` z7jf^jD8FQadM0D%%XZU@bUc>QJLE|3ed1F_+!$6HOgfbL;%ELmlY}cQ%I%ig0r?b! z?enSUO!mdw{qXbIX&P2o1r3n={_pcVG@vSg^-^zp=*M)ds#_u&4UL|^x)EGtZ}b|i zSF?4Ood!W`eE49yboC=V@Bk@Tm6s^lO%SQ%VPupP4r#Tt4T zOA4=j+$DFE`T8r!4El*u`^H`%2Vn!0wJbpW5eU*U%DkK+2m9;$T2t)*=P>G2wOxW_ zojDVqU`!EEr1jox>m4ty2wMS3-M$_Y*5I6^JNDzEzI_?C99D&hlsdNhqD%96t~5qs z6Nzt*Jumm_PVDdfygYQ6k-gcZEVRwk2Ld_h@(>1kfs8qVglcoI{U$298|j__J4g^f z=H-vAsU!=f1zkRC`$4&#^AydfwB{nLzPLvFEkrtTVpddsT@OS(Bfh2TP3@ScSiaAD z@;8Mt!NfJ^-c!efz=Vf$S@*Bko^^M3X)Mc~Y+PX$mvL=!K5|#Rxqd{m$KqI67=p(w z=i~g_59%vh;6zau)8nm>-tghe!?$d~qvphz{@q#8{~^i#6RqS4LwOnYe=!Ov4L*E+ zFI0}x+rBZs<@);Isy+8Kd3SI8(8D!6D{y@nlOm|`UcX0O*KmIV`bO?Z{(|);Su-n! z)#UN)gJ7@v;^8E%B(`sL;*al8e=nrudY=O>kmL>?&HBq{J#kgXFBj~;odHkGkHx2c zV>*0(J4*8gdP<#J25#5iTPWj5x*jH~cA*_+Q@+*fOIFyQoc1-^pH#|~P_xJMX*<1R zhIb!ag)Q2{d#&c!_u4sfIXSC5M)s0i)0S!ThcCuDE)WSN2T2w7c9v&@HFP>uGV3II z#tcnAG)xu23Wt=_Nk9L9M}~{X%dJ8ff&J`cJPB}x%R^7W02i1jkryYJ4xe7$Mo$7v zcU))8nw`QN*bqFg^n9_@PmF?a*0OZ`?zZ$(C~Lim%(@2aN5rM>wnj_``sQi)zpI>o zx_5ipA$?`0Ukb^`Sxq*Tk9GXMs}!Do00xry{yEmXE3c|a{H{Mf%N!oU8On3)TLya~ zjrtKNg#+Kh+1qSJxe2ld8R*^z+NJ-s6$U~mIlObh`G|~?%SYN(g6wzg8}BNMl$vDm znK~{IdenQ$aDMd#4R=YBiPaRB^U~J*Y^&J%0n9dE)4$!bNwDv-zpss~HR>|-v8lNU zV{s}`{{6V=KVC;nK@;Hzq5QDB=bP{@PQt*)(`S1gvfsHj9LSD-WGH%lrYDbhAJO?8 zZ?@#M19;vAx}3ur%W{L^@muF`zOcPN+2XQJ;UVmAzar_?7kzibFYWiNfafp2-Tb+7 z=yxZ9HF$a>=Vv{6FZsCEzODr6c;WlJJTHO~E@#gRu#H%db+Zi;Mx~-?ktB& znx&0dSS4sCN_z59TJP`%zYQX|bwJqGY0v;lt9HW29!%2mI)^pr{`$FWPWH5mRf20w zgdTe>{xRI0zg7Q(?Pc3#vZL9oKj)F=s})g1>auC~EOe>n3rIgh*cK#3C>Pywg(<4g zM10%4ICPu6ezR~CfEL8|3@z15Kh3mT_JgDMYtGm9e^{NA;4-MfQd&Cw>i62J(@=0q zEjf-vYKe#(?&zd!eMaq@=v80wTfa0aSTrGwG=5{V_Ul7s76 z{SKn7@Vha~R~vp_0AK9R2ppI|c#G*BU_4G}ty*>W>A|Q1awgEtv*7uO%QpPo8Tz^i@f1uo2Mcq zG)Hfg?mhiU#3jJ-z#e>`LtS^amlEc6YJ2@b8+MQ-+hU=5CeyLqyRX#o=hxM3?s@_^h7Uv&5~E=+y_dTO1y@!}rzG%dVBKVH#{xUK{{oZAhhkSyh91I*-iSjle( z?UB2rvt9Rs5(cvmKZy?2nKzagAzki!m@!gr3&X_eC zfjGb*a}n4PBWSSE$e;CmjXLq1zy4Y1)LrVgaXoD6E3@Y;dn&8({$2jxQ-groH2wTY zN!91C{raQmeC?BH{1dJJwF(mO`8nOec(w(3N#h7ji_H?rR*Ja#{1w@)R;pb}9xrOr zw{{6J#8tccJTS>$A{_R!k3drzJ@M}>0}(z5G#^&5dct;d(r=c>O){u%wX()VP?LqO zX1D3D+Kk>b_1fQbb`5N7guI(l9{uU>_ovea!stsq(&(74Bjmu#U;7@$zoVZ{v^D zj6oO@8qpA2JKOsYC@+Bpzw;05eG~@br~9vv=)L-29OVLh-smbE*YwKjt~k}N%Ixsy zuCMA4_STF=t67E=0@=?@u-`wpX$3dqzRS`}G~$EK)_t z3N^Y$%htEjtQCy=sWOj@IHQplk8H4+stXhzFg;@?+QjdaxYBDsw`no2)?lx@eq52g zg)5Z7gZ_S^Oo|kH3@a>Q;?>)-gV}xiTx)Daoc&e6ypu9RhSZG6w1^=dSoKQRPOd;2qPv=N1 z)L_Rwg9HTL^$TnW$a1z9mpG0Z2Qq?h!1Xw;7L|1V=ch@jzkT$!D#RRL2E;1Vyo>B4 z0!dFwNvF%)7>z>jvN^^q{$Z*)&lU?BKj|`f>hnsk$;c~We?Djsy$@v!nxojNPD(sY zYznWaeztRE(*AGkqy1Ko z9mpA#v(>bXLWIU~TisT=SgL{7wDGT-*~x9}1gVe4SGgcbv&$%XIJU662d;%Z2Qh#C zygd!R{Db?5?OT=6-j3%w{46!u- z#^T@l%J^Z)PX;JL&(F_BSB>ctHFhaVy*lXRChM;66{ScpXsfgIcA2bxJrccy$7Fr{ z7JX>!F{zYuHI#w-p!P=fM(znJx1*x3{pk0;XAqWh5tn_vQq%GH1!RAf;D2`k9Q8d& zD%Uqj87zEk>k8FTO(qvUm+Dw^lSvj&RQlUHp^2eYoR~in;Tox6g|OYkT}BrWsxMys z%_7seWTo!NfXY+6zfi*)HzyVUUaS;1Nkr!&r*-%lD>?BTtw3XrKlE$<1}ipuzuZ&A zZ-6=G7fHuucnkV!<6w~;nZfgxON>jvaB5xSyWVjF&&w+i-~5e#mit~-iO8VbV{Chl z_JX#md5QJ7hAfr3Ay|0~eeK!4f5OL7(m9#Z^@zg(seY4_M!i{v54*d39=}R&Wc)RF zc}NbVng-v6WeH+CE@3`096@TY{O%Po0Tw5K9~DsfW3;Nc!c3U6jSqe)C-0*_Ce5&n z)5b_mOJ|=3x?eLKwsl|@rHZ0re|GlfMvt^J`zK5A_i>gRP7~PRA>AEf$XR=bh*HOM8qe3$xQM8arK^oY`@X_a71F(s##mL zMb+q_R_xJMZAEQWEhYAzv8h>ARBcsi&)5W2)ZVdU#@@vCe0+cZXZ)U*d69dZ`;6)iLJsT3a0wkgx^-A(^<2iAP{#%GES4J6J?zy)JFxj+uxn^s0)hU|bpeMBt2`b*DQ z{q!Nr#)KAW11vkR@NgoQe=k-{*X{3QIUZjn@!*iZ{~c;Ha+t)6{(O7-ePHiFoR3An zdYXt?e5%p;`SZ9U!E%pZUJWmovKEwlo*y?9hzv?_28IyH_Qpwz`zC;7fqwj@l+q=N zfEwmKeByh1UOc7O&+q$mq_2n)KjZ{#D2M8WYqfHH&T%j*l~cNPr88B^LzGJVAHFbw z1AgXx`c4B)>9VJ?)m#j@xQS`4H`Wn#FZ%y+hB)zG*wcS`JSKV9qL4_FDUMiGVUX0vG~Li%^P zuEo{ToGF4T`S6=m-Isn_NOlk<#H=t(j~gP|@~4#;EJ4Y?@I>%$*q_e%yYgX_Wp_gm z46<2xIci>(*E03>Fiz{(4g}d>2I6-wh_+ql`o4R98r9l(yOXbPz2!7>ex4S0T&#c8 z^rm3__fE>ulwDDkWX<5to=@=BWNb<{g% zrSYA=Sgqz3gB8|CR+O6Ao(b!UZ;+;q&d5e?Q*X=nbf;g37q3v>F)P9BvSBB^Sw2Id z5jrRmLqF&(&v8F82{7+~wkg=1u`I9}VdQHsYdaZZs>|sDU0skPCkg)QANw$A7!CSH z;VTzVo_^8F;`o#QBwli47F@EBP$4AlGrD6r??0Kg^_OYL4a{qq6J4d2mitZMoD6iD z4=y5=Q%>Q^ED!0UrX2DADfGEpz5>j?{sfY+Y7%*&u-om^`4R4z&K8MxR^IIQ7LV6H zpGI&sHGg^6v=G6aVV_GswQw6R3PInZI*))SVT(P3qz6om`wC(oWcMnd6EZ(qW=g_# z-_2PcuevSXet93O;PvS|05$uvzqicNH}KD-^X&T5gpRy-%2;Be=%~2WntpZOzfTf% zs{@Js9`Dn)s7Y~EoL{{EfqP@uJUoTWUgCf2ua$$4+0o_;B{YW;Kx=#oN}dl!@HY^- zjuaYKc0;AkK1vxMeb0V^U_R%x6lB{7Coa6>gy^9Y(M(s^ePvWK;o*AHUN-dWl#cBz zeQDZ;+G(bC)I&*%xkPTBC}4M-+l(Ge3+k@h*w0SC<*<)YYLa@|*rwj1mhJO&RgOy) zIGvPN!0F^VzLntS738KgQ<>*i+IIIda_ndqZC;UUkI+4YxENHw#e=h*{pxTnIV%(B zsdb&gryD708B}UIEt^S|^1LQLrCXg`2rQdPY1(&D)@Nb^UJ-=Da5~LZPWU7{7m2tX z$qO~MuOb)`UZ~7iv_>lrWJnTETDGy(#4(cX>$DEaE)nVJH4xf=?@G|29IS(JerP%% zp1QH1@z&pa&wICpkn7cJ48Kt!CsAK9x}h}DnC68ZtBjdr{>%6L0Y(&h>ixdCjlD6L z@eQTM>J!xU->B;!@I9}!YtQTLn7K1FzeGqzTXKALv_pY#%$ao zY^Yo-Hmho@Af4}zz4advX||5}X%apE;oqpg*Nkdd4D2DVJrT(W>7xfs^ZX(2TA_vl z`y-!CJD87xpl9s5=z%9TMZQvJMKN2(d&hXOn2Lk}?0*7rnu$M~ibI~wcq)6kn1y*C zotZFln(hVfM=FezjRSYP(*(}sA>~yeLCv~X=u6Ru;>`V=evC)m6r&f}Ttg;Q%aLor zLlFasO;^2LH!CUt)a9@^O6dbMAMBaArLa|VKVm#ikf*1NTpCf-qMN`cJ5mjjHSR;76Uz@UNDgr)i!`BWi-wgySUa9CV4 zEBS-A#u+MR?{>Sit&4VD?*Zgb3(tU6E!5J62@Wg$jQDe`<}*k1s@e~CDGvKZ;S_y7 zwgdDR_fSM`S;m~^obAm=qD`#51zwul=FEB0 z;6M4K#m54NjK2#|(z$WG_Lcwm!XjMw)bZJmP_F}CdeAW2F-&eJ90r)H?CHVvn`oLp zZjf0|4y#8mTKAG7CWi1}l_>ShSoW}Us0-NulJ)r&SBH;3Gm}&0;0RdCHvyxBkrS0= zTTcNbB63Oc?8-~zGVqwF2*vTRl%_ULWd=lLewt0FG{sLo`cvgrff^A&CEHHqpP5$qAKDWHsu@Ili3 zmnia7o{_R?u;|I{73UvuSh}$QYZZfetmgb?g8KrS$IkYeU9Fv)!N0_z;Vu#DDa+E) zoqL#?H`JfH&8Q$Q=X&E=&;Y8dn!gpfitoE|Ict)yeQG#w&SBS9K`N+)*3lNKS`8*> z9B!0kO{MK5u|Id+NO;6Q>9^nCu{GtHDd4#vqPR}v{7^JQ?)zuTasoaBylu_QjSno^ zcLXtoZ%Pg(7Jzs2+0J}bt#VJ`scj!rS`(giuvN#@(iOQx>=K6cs}Xi{)}cv?zce}C zKJIdQqPwbv`8iWdTMEwA#S5HWGh&MAA$dkSu$pR|w5VV(UrbxX$u21N(`PLlP)g$f zy3zrilehR!BROTqd%?V7s_}_7hcgSq8>H~`uj5gF%J!HahtBD!oJ}HkUPgk#oH$8{ z*cT_Wwujr~?t+?=9;9=GAOD`?9jZ$PcR;l7U%6yDWmMZNQjH$v|apB2ZGk5)KnKKZy| z(7)?9UxeGT_5NY2p@v5(*>7AU;zb!~N+GUEdf_fJV3{sC^0@NQ4mjMtIPis=Pr~2L zGJXF*oeV-Z#wvWYnRNoa+l8ENX&{2cm797ss|J$B@NHdT@yRNm{7j|aagj^WlS^Bp zHMidArs|WFKQZRkQ9oP^yfIV5@t5o|8yUzl?@IBr==1$H{_1$U-l#89zQO|pU!*QC zUT66@e#1QXj>J0r=k$sZ7u1qlaz`hC>Sur>r`OuwX1iX57TM>ThWb84=d4m@$=AnM zBZ77v4w~I}$Te~ke=`53@A6y|pQ}G#d=9j%H6^H$7*!V{W|LVKCl)G}LXZ3Z9d9Lw z+U&K6dL_61trU8fPo*dExNxI{O6pj7H*hDnTe*PtO!Dc>`5NH;Rsiou26cytFl8Tc z7oq%lQCkN8>~Gf;nCdd}jy!%PpJ#sE$?3hTH&q~&8B#l`NASpJU9HIt*J4*=hf9tx zxqmX3Z0t~;P#jOuS1~=_-fOO8@?*YyFP3<+YMj;25s@NwF|Y@9j$zg7*bd+l!*uPqRNrTWtR zvQnUdSwAyI?NiB-RsD^gE8!V)srH9S+y+jcj@DE=W=A)$!Z=UJF;QUQc0LDs4?;rB zO}${L#5y0?q0F8*#V3zJD;4;Sv>(R(FjqN0(fMvYh5w~4%|gGqT@Cvf4udgX{N2s>VRG5#V1ZDBm)2Owg;@j(1;XYfNY?km2ZIK%Pfbk!6w-jEDu!0X2=M%> zutasr{u7cbn(a^V5x$^frIN63> zV`gXMq;T%t62A?^xL5#0;1)4AiQW)>j#{>F622vQ(Av((F?wWrU6hjU&v4YXVMcVJ ztakSBa6V0v>qhB+0bZt})|Ryj@G^q81M!W~8Y{sm6zZ1FN|*YA!{Bft7i)vxK~I;8 zequ)*yAxfibHWz&>og@r`V*SQ{$A~l+v01d*xg}N0;Loyu%X8OhB)2bt9Zg(<;Rv& zlIirUq$tX|2xX;<%5a<1?Odz?lK}wGE5ds@(YVy>i?}l_o^%WOGS7=!TrqI_2FQcM zkF2>FlsU_*p^FCH*P1;Bl7;n}lAgxLGylf_MhgR$H9kxt{IjF^YIdekin_%Ef@-l& zyjzU3^+W|}`Ji1U6) zrmuNVLHcgi@L;`f(YQ~DWz&3wq9k}e`SR-dv57x*CPg(!Esc)Tahol~^JJ%tf(qy37p>IHulh{lS58W~Io<<1FVD_?$~Vj&o$;JxmWW7=v}@xz;6Vlz$LH@z8`R)pD4g=wy zM6g6YWz8*;*HPyu4RG=Cb|D>1Avb_Cd3l!|^!+nH)pkeie?0wn6t)MV&J^^*T$!s8 zOwlu}(iggDlI$v$@cL${07_Wmx_5>-{I%Lu}Z# zeywHbKPtt=X&RD=j(TIi{=2t65Iq8+^$CvynJJ1^eZGLCjI3qZ()Qo%j=x|7#rX-k zPw9-hOpv6g0BHQ9(~QI?UO^3MffW+>$Z4{v@ok3v*fRH3hIrm@JiQR!IPvjpu8@&+y7LcHx6B2TDva6FOKqrh|m2 ztu+2GqO27vJrdsuy z=|Bt9${^plR}u#8|^vvXB2~awY%Z>;1mIdlH(w_NyeI zeVPTD-AYNtjr~iLmkp2gpBpZ5Y6~vVxI`mlO|_)Ps!(CRK-V_IMZ#uvV$r*m&FXJ< zd#Bdb1D+&GrqR#-K@F(_oH^6s_DjbW7V@S?{`Q)%*xF;?<}3kH${|zYeM zA(X>3I1Mbu=~T~r%6Wo!cIeb%$2^$petO8?zjc!cRotW`aewv@#`3Jto_N>6EaqFuMfV~Klk06sdr2DV+$4OHakyV9OOz%B=bC~ zr0<1U;Rib$luH4!(R1ls>@oZ>C%o&@Z>Owi_%=?vqC>Bx8Zii`KSRbd@3&`=6{)l3bclgG#ku1Pfnq>3v(cWlDKRpv1bb^ zF=2uzLz%63THBk@X|(}g6RcuRdr5IUseZU~*A9x=D!Hckgfr86K1qYW^<7*xQs%eN zPsX<1twyC!0KxETQlr_bGR8@+ufJ`{Y6|Q_byAtyeUqWXZhV4Wuf#jvfj1dYH~SBV z(e|N+^ZWs5ao@`>?`wvAoj)%#qnFWyeaZu7(PAnj+WI=_hQ7!V!F16V?aBSgEJpC% z+BVrL_DLWb$+4?vC{Tn;g9@5wPZ zIT)Hl`w9VpKdpCWt)WeN2;_VxzT%A;x+va3PU$poh~gH_raCK!xkNfr!GmlmnUdb@ zA?ty2`g@LL{e<9~x?9 zdCl0^rj>?Xm#d6^$sq&8OR6UXJ47xb#?V?K2fo-(qf~t&1MWSZy@CDhV`U>ORT*lV zlSe;avn^%DEDESm;tH%tYlXPBg4h|@Dfz=7U;@9(!7H6-V@JGS`*+z%*-I;o43O@j zRoZ%+C+47=g2`quu!crGMYUFvND|6jnr)gfhQ^JS)Uzz+7S+t+S$Z5383Ru&K1TE^ z4lK$1fFr!4Q_cwTtfq2Zy(C=nIZc>mp+DP(^^XNN8Pf=*U9?(kU8g|deYGXcxAyqE7sPhe}bKC|bc0f2M^co(}QqshW6(NY^DbFCc zBCwJ>TEY#Q+zNH-;W;WQdocWEL?9JAJw8+Awe*o1t;jO8$M~pkg+?g3=O=T}!So~P zS2&_Yxl4B>VBbck^LNh18zj5L&vbr}{%^Uwre&|8+9h(^1!Kr|a_X&d-OI#ppwKAx zWn+9x8~-}Go-$kFEYtcV#KzB9;mC?gPvp3m*L`V&GOp?fzc1dlYi$&N(XSBg*|)!2 z_c`Ga)PLMaQSR>-8g|hZ|Hp}@IOw2mxbR-R^e#({DFX80DF7$-9iMp|>SX)|31A=% zdv~Q2PY2Xn5T$|<+6n`f@|i%;d`;>&#!e1@YFhSHXEvbnNz-EWY^nisvqh&tuSWHU z{;dHl7bztYsco>>NjA((!jMiwFnmDy^>AQLfT}NK*0~1X8(_wf(+BI_BVA9&JV71dLF$ulhh((w? z)p}`^2fxhA*}k4A>P>l(*GE(f`l!)-UZWM8F5j#3^l28q@fq=@#>x*$;wO}h^_PXH z_uE(%HHSm!7{2fFG<(#Fk}e^M(wag#M(z5ym~w%+&-6c8WV zfztx?{OOlr@=e@fD*4VeJ_=Bi?s~V-<>2Z}EnLmx*FF?{!$9QME_nc;3v32kJ4|!p= z-TlG-Fr~YFwkacA`|POxQMAx_gA!2#k9L%@&cZ61z5(~gv* zP4=U3BApQG*(o}oKZ)%+zPE{fRE{55c`Rs?k8RrXN)BT+JNk4wCh!Z&B0Qt@gK>*i z;_+To?UUTJ|EN*4JrQIj9(WfHMR-R>_M=yZNU)A+$<5@Wj-F3+GP0!u2#j~>n^Z)@AT#2^U_;vp(U&8)~!jbi@s)O*eX-Y%I$V9a4Wy3lxSWCRmMo z_mZ2OJd)9|zU3I5}4t#ZDEG2QL=wGh`?lOws5rG!s8jsW`Xx;y`gs1hYuQmJ?Tg>c81y7npq7%+e3zkAr@l+J9}7 zHZOp!dz#m{gmoA7KX!g(P>wLOHBn0as3Fy-u(R{E>EZ5t*G#!kKT-PiKMHG%9B*kZ z;AfAW&0u`If?64ds~hcX7euVje zSVE%B?iYuOu6xb5&iDN4KDu4mNj@Hh57o-kavco^=Jnp<6*o^gaq+hQwLMl0Vrxnb zq?%h>^?na6L`m|P4ou~a9vT)(%lV%j7ByugmTH^&8&q`C#y>=t%?(74b`lHpR1`s7 zHszSC?;JzJ-d1L&V=F5ZJ$j=bB)VU{p_E@D<5_j2Nec}Qq0W;7ZeE!GQ5*k2w-zX+ zX~#N0;~iMxXMo3B8gsKdhc_@T-T^H{tO5x0_)@D89Hh9d!|57Czq0!DSO9D0kYH}3 zEQowB_c3Lva8a}DgUNv5tq!911%o+2{DsQxw>(&wI9+iMClyR2TV*j%ut3f#$3SjrqSOC(@VPv6`e!DM-eUa3Dd3vflu)jOyj9(~C>B z&1k;^R(F-DZ<2j;-!^0J*B}30&RhnGMqO3ZzUi;)^Vm2|*j&XA_o;G3yEJff(#|pO zdF4&x=S_Y{|LGB);HdJ%dBbDi*U!4*%53A!Lnm8cB)zuV1)Ez>UD-CTV`Bz#pQ7OfjUBue4 zuQ?}zjbriQXqWVm(8HSN8clVa()PyqPQTKJ}XL#~Kt zH^bVa>6N9!&J)Xj+`F0@_7sFKjHmqBR2t*|-CovYGO5~IJ=YaE%6yEjo)kwOl&EH$ zP7#L~f602+I3kW4D;n>s-B|Oy9G-Wa>OT{({${)tH%^WXmt2#C6^d`qi(i@9O*!(U z82HPn0|_%x!KSFb|4&eQQ@d`|C|?5@LQ9!Jlcn$iBH>Syh?6WVhNQ}LeH$8hs-uAoG%xcF$M9RIe5eyskqEF|g2l2A2=z?z3 z1io#+hDZtv_SH4OkeQYMIB@G|-_ubiBNGHFM#w@Nz;4*)y9$5Sk25Nxc4Y=uM~9>N zvnV!3lvKY(w2uXr8^h}TQ|BP9Vkh>Rx z_T}9p>tu5AtZ;-Ez<*Acn^1~(@V}|ghB$XLYa!#a6WSk74Uaid(8SCoPUePcB)dWt z`vjVG?sFJV3^gW2?~zMN!3%g7%W2U!)bV-q-?U8HJfPNpEP=!^oN_R5BPd7oI?Rv% zcrq(7t&gOUb6#L-psy`IYr~nR)L~cKqr-Ar`XMk@{IE*Z?oG9W5S9%0?M2)sYb~e0 zUYjaqq}c1b{vt{PDr!HvKk3$JDIIkk$w|Zv!d!qF41gVgqFnX0_2wOY|5`9Y0!-W@ z?GMi^mfS_GQs4Fo&7Nr!P?>6GtL4Jxe1cSK<1vWgI`C=mqV<34s?9lFH_q5bTuwjD zgfm=Q9L*&4bEcpDiKc2JDYeLeNJlfViv&tBeh=L%XDmtW!l}MvA@-kVl{^!x253)v zAegfB>3jXsG1bl>^dP>w&#Mk1bNHbyLkXkB3~-Oi5o3}nd&GL3Adh6!p?&WlVK7H) z|4vQabQ;x;4*Fqq^e@*fx2~r5a%@~>Si8(v>gvB_6#q zkJpq#YhmKG9gk42Y}wZJOSSr`y{%!Si6qvR{k3HRE7byM48GTEW+hVaXfvWK zN6hK>)pZZ=%LqkPM}aAkkB9a12}+~o#;>0L8ZL`z`GH_!Z+|nBZ5PZ8pw(lWpCZE? zt`01COQqu^)nz(6w}}TR9sU_a%^QoMiJ$aLJiuO5(I#WqGPg8M$u1>yXCH)KtOP5u zE}Ra~{dO~!A4nn!miRCmh=RaJ!cQM9=-v&w1JU|!ow;+>o%?dJ&!A3(8>@xDU3wVa z!s=j3Z`5ea(+jD?&Z}N+hv)tR5)T$FppppxOQjwX9WsYrNP)ZTGuv~VWK4q#=(MRu z1{AwRqSqWZmEog`dP^q;=6`E;fet#Kbdss20fbojBTVQo>eXz4TReL&jX`Xh8{spz zcDu$VL;9mGx`88Yys;Ua@+PsqKNL!267+59RcApFjbP<16V|6CQLp?jE7Gu5GGAnA zE*2l3OZWK#mZ^Mve=4ELBW>)YQdLHG=PZDkTj!Mh>+&W_o;APf+a}?KXz}Na$e_(=QVUIqOrdTaQ1&oB|k}#srqB zxEITiM&&JPTU2ple<9-4j*A!Ww?L7XAjl%{Zk{M(Qkwj)?XTP>;HHZpCl8GZTdboK zBZaN|6dmctdnmaU-lh4jAnk4;z_s$KBg_drAR*pfvNbtTU!IJS58-Qzqh)z462q1_BX!%o<8$eE?{*jqUq1E zqffAsE7qsHQZH$md~RdGqF%Ux@?7a6j8#>~Cbw?hK%n`XUWn-`fXFt)llRy~K@k~X zu>aj<_iHBO^OhHJtpx0(xD=MTw6wAN8SF}TJ4+)CeO42<))HmOx=SBdp>82{d??W9 zam_xY@+H#dcmJa9Y&||g7#kqUp+NSTydynfd+waNl8+)nUaB&O-!NT!6x#HD(Ub9* zJ?$&4hz+#C#S6W$GhyJ*i1&}35C)>=Q32WIF(LvjK*UJqFGM_TgCHSp`lPN=2!}EVI95^qm3NcBO;Va|;c~g&YDWIB<4oM?UYhu1?14;V z<%j9~qLugN&Lv|2z%E3!0Ju-Q<~}Z{NLmgroTf#eBc_;yC+K-Ai_=&InIk-Okx0&w zdHxY=_USzsOf;F*FrTdPQ5D}ut0tApZP2xCdPt3xjUm|Q^(`02`!u4S0->c!Fs=Jt1jm-kZ{wM3O zco#mWk5?9e&^Q3VCB8I@n=X>pU=PIO^a?^koUqptF#9j8bgN)i+FKd28JVJ3D#U}o zmoQK%*w8?lG&S~tCzOxaXW|QD247O-n`NPy0Pl*44h91t43-Ne6j%>{HPxT+JYIlE ze&!GvgKyh(FNAB|YbBY_ncYxCbsJy3p;b3}HDdRRBZc%I~R&O#f`xyzk+6wc`Rl; zD|Os_A`vbUisF3MQbpxw<pRJ zquqshdexPtCD4kLfoX5Q>IPE@eTEFwY(h?~?jy8#+dW}pjy7Hva4f4k+|%(Gf9>98 zVx}tV;)VX-$3E&~9wyT5Ib4Nub)gi*z~?pQ??2qf2!_f*?gE2%>#8Ag$vxLTp$`ogMX;1aQbeL>krpEbbi0i~ z_XbkUC@8Grh3bQ5r~d%sz<~H(-4U_z`>lTw3H#XrCXiyqu7X`~=|vi-eXMDcJ$s-n zO%EtYbP|8+8AYl$WuH8?tFolnZ9QbGeK!c2 z-$l)c-{7Q-8`V7A_uAKC=Z?*iO$7QGQBR<$P88lUB7^Q>VR{0oUYNc#9v`Q_0b5n+ zqjqk;kvRu^Xu;SVQDfK25}ReQ@^K?arb3j=jmfMo5;K@P7MsU z9gX%~)cH9^WnWnwPv5e-4mL7>7V(A(^gJ+K{xpQT@(|ApfQxR(lnOh_g4K_Jf+eS7Vj)E*jIzxArDuE9KH6Chw-u( zG8=lKi^{K=*&Gvo7`b4X{3*_Uhv?fLZ{7%?5S0avUgi5|o(6Uv?bd1ofjSmWt>H*?XYiR;)v zGY|yOg^25M^rLSqfRnNe3<)55mJB9MOMy3%?*saQ^d9r@CAX0(`^9c4SN4lh)OQ*iH<6AdQ5ZW#u{ zR(okjK@< zHt^+#p5rdcm%9F)ph%b-fB^%qiS$6crN2Pg9*ipQ-m(igJKaTTsgqpxkP|y74+vX3 zx00j<_8uBqQ`S67B-j;*g(d@dJGs1O2=G2l;2?=TqAz*9 zvDFZTO-Wh$jS}7B#kYZykyK8R8j@g>@AyZ_^0@U2XVSz;>ND>W<8NKi|2>3^zs|Fm z$;xbxAUexR+_t3iOIGC2DOt{0$P4Wo+l{Rp&$p_@Z%~|3M_cH%XRx+ z-SgUyYGyk>11p<>lL{>aUDHdwCzEgkhW`wnY9>%&SIhE9gnA$zToo1(nUQ&1$QVqH zpM@Wz>0`1@c9IsASgB1*pf#zh#^`;d~2JZ@& zF%{fmK`akOz3;U0C$F>d*AN+ntY)c1&t3BPx!~%WFG@6>f%-!~0_{bDWU$QrLGi?Q6P@(}Ym|C{jB+%JF6ldeZxvcZ2fO)`(_ zXwf6{Xld%Hr9DtVLeT2zAg+H1cujn|`JoPdpz%QHMQxSJRG>su^h^4RyO>C+r;Bg$ z*(vuMB#gz3>?H5k;p(Pr(T(S8q;eEyyw$!{2IZ>kp1(YT?62LLD(@lR`pdmRT|Z@B z|K~NUWBSIQ=(fd_IwCvZMWj4DSRyLm=&#dl)cTP_&W75PUwlq~PV|#=*7F@6rUL>`0y9rWE@(NuR*)6?s zETApjbb$J?A%Fl7B+gkL&#a3FC7`q?lpj{rF!PU{p!dg)9FOm`6k`2;A4yP5Zq(BB z==(VF^Sx-lpgkU7#jYK_HKkCW@%`>-4Jxhx18a^Xao=zqX}u4OF8okE+k?bok`8!S z4q`yMPoyv@oG?LuVA(v@!K{>GV$EE1TIC$(qhPA)quaYNc6vx`=uJ`9j73%v0fU7W z0WATg<8u|&U{atb@%iizTqmItd=CPoG0m;QfpZVPJjCDS${}|Dk>qttJ9A6ecY9<%-aiK?(HwF$ag8jUXaf(wT}=XZQZ5rFcATY!+EZ zBB^PSq?$f`$L>f7Zo|xY?@HV<1Gl4*OSj9j`EBpaxA7}~%4HGCjMv`zF_0ag014=@ zKimZ%&fkY@>3BDGa7XVR#UKe_vdq9oeFM&&Z`zD@JG~@hL&Rp&LmfDi59<HjXtk7o`;NtXgvIG<2%#&G3fk!UA*$#_YP? zA2gcpRBd+M*r`qikW3b6)&S}SqLF^K^99!+^{vz=!mWxHt(=p*>swvpLn_$P#_(b~ z#0E5nQTL_(@Zj4#yX}|1d?Og&QHn+P1XXl$`fPRwawMX|hAZ}YgVxURgQc?XH+*BE zG|)RlPrFwJOyvZn6n#YjdN#LAz+k2=fP|p#p$h~k9xVOwIwBIbY<6u<3!v-P#lJ#7 z$I`^SWpheZu5`H4XX8+VKXNlkc};l3`0M#2fdGNzFRlWX?z`B^Fxpn|X7}?qqsi7@ zst1YyL;;DBSo6hl?8;*T*OfCy48G9?Rjm&+={A4ZNM$;*Hed0sib>#K%~e#Omd3@| zOpx=RxZe8DzJQ{1;H)9_I1oPuG&5R*87xTYcLv((4;??3hW@)f!^He=hYqB|JmfDM z4}O1GpU@%pE9b!WJKL0XdIjH0CCFqP>nKaIgz?O zqqq;HpVZfQga*kQWDxo6hx!1|B4gpbywRD@>3gI;p?uBRL~P*`I+&H@Th@o2UTHnR zJCt<}slb?_1qe>h(E8)FTH2aNP>|PYqv!3>Zh@20^CKdK>F7Uqh{cKsg=k{+r|KO3 zY)XwS>cJadWSspGE|N@Kci!x>+mExXTx_U{arc$qXFM<_v6lhOT|L#h zIV~kT6n^Df_x7vh*;#a5)LBdqF?!Q=X z4U)$Wv5lE*T--BX?d7pjZ>CRLjL~;N+OT=_hYp|bZ@({y6Hlgx>}3K=%mVg)H{|B_ zkUE}(wtqAJonCX*^Q3V;L+v$T{%AbG$K`}*Yk1B>hAO1XAR9HOWzSo`+EYzGW#Kek zEJ|#}s54d4D1!bjHc|7rNn}r7tP+ZsqBSq#rlIElgE{QONh*={gKtQW7shxqbD`d= z=EO;+b8()gV+C_VANxPT8&d3Snkl=im6U5Ox}%A_LL?q8-1J2K2GkPxMl4W?&v-cS zdA)@Q%{`Z(VQNQkpXzv^kbY*EPzXb>6_i(HX=3A-6SL?(c4jBTTB&{lhmV%em8W|m4!9$3><|f{#i`AR;lg`_tktYd^D0v7%Y~MW$ebm~q@n-bowqH#X$S|Hx?cdfuEH?|*j^_|iWg=Z zh|3;+8i5)xW|GY=Vg5%?(Q@}?J`$f`stJ5{ty<{s+LSfX6Kgl?h^OFN@qHp>Yi0RY z^v5Hjh}c~yj!-FTB{vTv`n;YGqI<^WJE1Cu_smVB=v1fpi}2yg82QCsO_#ef(gT?QA z??R5*^&59gxmto*4L?rGcV;7drY`HpZcb`I3x!)fig#!PG>HuA++9k@hWJLM*9Wuz z`1#nU22Y4{S4dU6c}GZ&P5QGGAJ+P9hl8Mrs2lbE2Slin>cEKQ0Su;dhVJQVA-A|!I!aMJqD8&IO6vl`N|zwx-jHO3obULTP|_=bB7_ArubdOQO?+z7N^skPIRUIY<_j0~h}lQ&xPYL9_8g7P z7FI*1soKp<>gDXWz?1dXc)k)`PSF;RO@ivHxM$H%jWuVK4I_xd<`SeYZReWDhkK56 zFqAjdlZAY*KA>d-)lQ$|wPeYQQi=uXmA#O`qL zo#UZI$xRSB^f-Y%CW>$uBga_SSZgD*UofoRANsshr3bf@>C3oQptjK(uL=33P;*Qc_`6kW0=q4jw0>^_#jv-%a!5(_`EWS6F zqDsNQRf#ky5~4hw(e_H4 zXg3xwOFm+yPfkT@lF*)`L6C4{mEvr`oUiQ{v1vQoNCoqOkU{@!fzmbKl)538+Mr}^+R(!+j_(zrfP0`$uhh8*Ga32x z@tTgFQd%ZeKr>$)+-JIo9Wm(+th)Yz8QUN5{kxyj!aQ{#k@DPWEM2feEWRqwT5Ig# z&gWbgiEFMlA5X5$iETg_o0)+Bh8b$Bb&(jxfuHAg2#S@4UVU=jfuP1?jx&`&6t`PK zMb|+uUj*eO4JV{BHfKr2Ohk7iKd<}!W>-$rkB?$({yDaVxr#ge(P&<(ur(elJB598 zdY$jl7e@Hj4Wb~-L+lKSqZDxQMbf%>sM#g2hpzPi$zbeFGV*`F1yC=3ojGshiD=}M z%=1@mEzqmGOzX^0|7qcx<(GaNWobTJ5PGQz->esUfc8AHal7LIk=Xi7r6-q`zi>0h z|2bU@iWU_S*DrPShmx$d_<`w8?P1P)5aG=7l8)`5HQ0MxTMkTnFxFKPLWX_2UM&>e zooBxEY}qA(ZpPsU-7@PE)fr~-hEVKquWxOl!`;(z_|ELvgH~w(1dze?RR1x81+lXC! z@3$R(@l5F4;imP$>>(!X|5W^ckxa*tr>jUsQd$&DW1;SygH1LJu2R(QOYoV)fLRjG zu17_mD=OYV^-VhzK@ty&De#z&JnCV~h1nEi&!8Vt0p$iL7=Wy3yh>}NWuR3@x4~_K z#NFQ~agSu62!8~;@E~N%x4s?L<)XXX)Z~dAHVO0mNyW>J1@2|!u{UHI`WLgiz(UG? zRwgLvsm*xi_TGde!W=}kEybr=*jrw~Hy|7qw*Oo0mO6+U1Cjzo96DWC;cnpo{^R9R znEjUxLKB+Wq5|N4+`QT`-YTVQWlB_A$uP2rS8mGqky9Iv@F3MK<@r$(h!qnpC89he zW!L{J)a=Q$jMIhv4?4-$kd|`aJNuUZwS~y=0D5R}N}J|VX@8o!%LvL-b`_|7Ke zj7Eaytdh@+U`siML_riDP0%3}$>bZyj^Pf6@>`H-4hl@g%@0hxX-}SU>M<@%6 z@J))Fx02>;=m?2%L}vER-|~3)s~hl( zH!);;(rX2vnC;`)14=_l6mfl*IIsOc#v0uis%%HyS@&yJynBkLAhs8b-(@Q)UgCu; zuS?Y|&21XwQxX@>jSTu1Z~FcgerEisyR7mrfk7em!gRQN9n2Ir8JcY6N42}!)_^8< z*VFwkT?1XKRo}jW?^$3(#34R6I|C(6J~Jo`Oa*GX<+Gf0bjKb<7ep$nye5T%*6>JG z5Yb&GW#e^sen(67kN%sV%5RQ?i>8Sv!p0o1kE0Iydq)#5+Z}Q}r~N`#c{E4a2rZ24 z*;q4}!>v22fmh5ZuPSa`hg1!t2&=mc+btcE)vbYA3R z)xY{Z&DY;*p#W|`>Ha96`ycET`V*+D#Oh2rRe?493A{%LAIAxB$_pKqpa=zN(0OX> z`^?kWs0_SP`A;e0Ax`OAOqv**m2nKN@;*W{JGUY>B5z zFa82eST?*1{V|bK#*iTl;sV)$NNClw+k{nAWfgI|gub8; zFSJ6U;*m6`;J7j9*btWbpi2fMdmA@YgI#)=PeR?N?q)NH%>aIs^M?Iz4i{Nhc28#g z4^0o&qswZ8SJDH{!a@XVytX?v6AZezCdw<37lXrZBz+kg}){JSt=8Rlql6 z5ZQ{$Oq&d7?i&v&7fIka6W2=~*g9Xqi{0XO0Tt84{V}-ENvK4$BZZNi^M#^^lYbj0 zfxZoyBDwOXpLyB4I&HDHksSz%^`oB$5J8qT^YJgp?)3G?pGOc*GcYP=Qm(|Ns=k*>AYI?PgMGKVDk)e!3EzLw zlO`e=4p#)cAK!3uXZD1B$uYTsmKE4iM)8^fCoAy>aE)xqz_-=RT#)0yqh6I-`4(45 zA8k7bQnyJEe`Li+qZILT<-z0kWG}ud(i<4Gat%g3sC*5C(8v_?fsHH`LCQ?rdpg+ zvbL`t{zo6F0#`G(^4>&s{x_$|0|!&=Z*eiPGttwvNGzG>2qG-oQP0{5 zQwFb+b};Q|tL3SXm3Ozl(-%0HETfA&Mu2SL=utB%flPsNC*N zMq2@JC3{8Xt{k8mV4c(oQn@nrLURQJKvcBKpzq1Rav)+FHTm}M{ri(*b+-bbL5-F+ z2^3`lo@2yH^4!^laNlQUF4G@&r6a+p5VV&IRbbkYCt4J?6|Ui;}&bhSX=0WI+s=69d7 zM_Y`pwwxya@hOzw&Accswp#A zHHBxE+i(32QRm?|eYQ%!67^|v^{e;O1=P$1gx#3&-pV#xK?itn8i?U$dEm???E;|u znWmF@$r>%w?Jf{YcC4PXD?uEV<{2K&vOlXg zboz!JH}E?Mc)f34^Ygle2Z>et0G~K@eXPJOe9wdnIum5?Kh5|!PcL*oKer*^44sKq z-$Q+vET#tP%M2;1gyoJLsGQouOdb6OWHLPf55-!~46%)Vek)+N}nKut_;&6_|{b{msVjRkuO!cmOD+BOHI1y0y4SePu zgwOwis;cbmfnvN{4fIYtI$D2jLezx=`!IBHsqm+RLq+xAk7jn9ocdbmjp72eB60eK;);KOS`&^LUr-M4#Nt%vZJ_LMq>R7%U3LEe~oxTyv)`=lLPMA`?(wWtvlgf zWWJk6Za9JY^%7{=Pfy|MUi{Dd|B>Gbe>8ABRtfzZEbK{iw`#>wh0Rm3k87#C-p35- zaqc(}0AH-#?x4BY$zC@5S07i?pD$@5fjrUi2jWxcTwKX}c)*CB_iq%Vd+Vn%MZ zs|5scI9lO*tkw1S4|%^;xDV`O2sEaF+vV>e*eZ1YUv2giY6ENL%(W3`r}`<|S}KE) z*+06txbuk0QIl#0w9p3*w$&=(1h4-8_2{{oA4tGN?j*>XA7d}Q8yh<0Xq-gfG z&B{5y`7UDdxrtB2lFXvt*uBW$BrhV`NO<6i^yb}zic)H6wc|_AE+Q9_xVG0v)dYmB zo@U>lkg7dfgKR;}jI#d`%etJX{hTJ*Wz!Co2P=Z~mB`nFhiB?j|1>g8nc%MYYkvX1y(P0CWuJb=a#L%#PyMIk?`g;AgCx)ppw&NDzhGIfLO*)X8h-~Jgd z39yzvL{|-V!TZoQL$R%;PI3jy6pu=EEIkQ`#FqBfb96|!`o-au^=9im=dQuz^Eyxr zwe(EoE%xz`-R^{K8ldofvkOthvP2R$*|=yp@rzO`mRQ6#h6YVI<|TUnD?kT~K{;B9 z{D4!=z6MGgr+RqLEm|gEN2E>w23rf8Pm#U^DZw7i*Ej<+hi?UM*a{t(r!T9KyglwX z(Bt~HTK^!S?sUUrKwyTcN0wlE-q)aQED}NP)ccmRZPk_0iL%hgK0kZw-itaH4&W(0Tq-h`=aUR7f49BBrNmB{ywkr(9j=J z)>>|GsqN?kSW=Zb(YO~)4vM+=-dl6Zi9qZ9cm|77_$1TzczqVf7w}R>`j+X33(=3q zi!o&0WxxRSUaOqFj_y;1$&#$Z-1ym0y!O}sHRT#LW6%s@U-r6nPQa4+h41}Ps$Loq z5|EoNO2eSxp2R>KK`^0`u~oMks}OtJ+o-#B1v=qcV9MsT8$vk&rR>3UK|Npm-og|A z)-A_DE*#?OTc-&j|DM8e&)D~VK%U$_{bMZ4S(>MWqJ-?v!A+$-Tt24X7epN#btq=z zBS0|zPC<1Qc!doZe9hj9j?gD6gIK3Lbf#=uF*HuIs<5Ur3CMnaK9RMpE*5#LAIT9*&n{+Kq=DGX*aUOz3<2>qo zG0hzm-GurgpW` z3G=vLA`QJ<`sv*uzD*}XIQfB5m6N;R_O5MYb}8pTU#7uxwsQlOhdhGW=7GQ6l<(0$ z7p?4A`ohkB5(sjQ>U3{DDT?p>rSIZguh~Z8RjnoJ-b}MI1tZ5Zc@5hO_eUkS{#yQL zB~dEpH4 z@=(#GUjuPC$v}fT!Z2sm+*qQdGj_Wt_4AJ9D=J$A zCV|D8_@((P^5f_WefG~!1bp!71xIO$J6lL3sp2CjZdJhh+_r=2welTcV>t2avSn8w z$KNJLMn+cUJp^k4Ka+3#)>w~Cp<$@?@#i$=16!Aehs3@e$Pu0N>nGo<+O20N`az6{ z7}D2l`u&qT=qg2>YJ_$9*`Q?WXTHS9d%exK9ymsCUB_6Fc1mnEp(JIkJmu9LHXo{9 z`X5tb~HKv>?*aKx1FG1?F(>6~e<(aL~%Ot^t z4Y^c_2NGirPs`6G2AOz+2{ZT!4~rny)eHnc5Ilcy1VL z6)d5k{gESCd61sh%Qp%9(WpJ^E2gP-|EF4J(_o{#veF`@H&HXro;U~p)XUNU;+DPp zxcnR8AwyKkiDJ1-(px&$NeZteNZ$U;^+feR$;bQ-lX|~M79vuG$TS9P9>S4CQ0-6A zmcwF##D7%;dd^n$^6s1q&sM659X6t_9#&;PBBRKaja=eLG=!UVFXyDu?5u4+(A;~) zY3?-pleDk*)R}4zjlp~iK5M9l{>94t0AJ(*$vUU;uqRN$4Yg;^{`nU4ovCKwCCyBBsmviXz9pMYUm+Fq-ZxoUTlLU)|2xdoIttQy=b(KgV*=cJT926NL=$@_598xzQSp*2E?>~F9i}u z$VBdjxXeTb?H$ZjwJgqWoxN7NK6eG6wx#mZE!!t&E4vo)8)G*c?`iJbw9Wv}=qcxM zo^(kq{bHYA=q;iS7l2u1fh73BRNLp3{`E%FTs;HULqhaIh>X(^+g zno;qIa>`?y>`pcpz|oZ^!U`ydoAxhe&Ti?OM>clXC4^`-j3Ozq@9-2ZCE#hc+biqO zXl#A<6kJG*8(97c`TIBNq!T{$NZoBMkKqm*j|%U3hhqEW6l1S`iOUFy-440F|57xP z2b_GeVrSI3H#!%W3A5lreU>B{kdkZU32$9uUIkQ_gVgIhc( zVPp9}-4TF9z3*I^spSGF%tbW^cIfLD-oH2h1)=A6(4%p+Sj8^B*Npm+LUVc3I<{K5 zEhBO0e&<5JR)M>+qdwp2>QwKFJpuX+Yuw*0goB?{DLG0nX3#d2zqYU2h8^(Dx#p`I#9 z*;BEv@Z(~t4kGc8glNRes^0XiuA@S6*tyDu>!tiY$f|zpWg%3Uhm6WTqc>FbLW1qgz>eLEF-)-@miI46*izp{bCvFAwL!^ z>nDFy5SSQz)iSU{J`pIaQsY00OLPc(z&F~>Y%$I=W_q=2}O2Kv?IRdDSPF7Es-Ul`be)`YPyEOA`16IhqY)BeK~AwPC&*8Su2}g$ap(E{ zgj3clQC@veQJ`s7ruX%ZTPRgNbzXSx9j+Y$x-HUZ9n`P;E+?DWiC0|v80uM6_~94I z+J|O;OmgxR=p^h@6TJGoS{g(H_K|T^X6l@Qlz<-O{v2M!Y&9#GO}*^|$zb*$F=-ko zhi9KM9G>GbHO@1wD^|@uXXfDSOqu~tu*cq{1@p+jl*b&iTw z<5|362}wAi%5JoQ_K+b&WVyAyZtRA*Oa0o7^T2hJ%3N}o>utI<&5%)d!G1&GiGf;C z3WhCy*rz&si{ouT4DPdmRnUhaDn*n3oIbvJZ68db5PriL)#w(Q_zZ*%x@O&2M(wB>Ftj8K^eAEdQ)W^3+xaK7Fh(p#jIB9aemb-kbgvJ)ntZeonz zit$fJ4OC_X>PN1D5PuR|qGLhYOaG6GfLf|F^Hy)v!kB&{c9k(i9ZHntyba0+zt{=y zC5smz(%j_?`P#dqv?iJ>o$K4LSRnOdxf(H*KxB8L$9BYP86m2W7D5ZXL_$%?#>4olf!glGmCbG`sn~espm{O@`drH5jhME7|wU{DgPi3s? zH`7Ee&u`nX2Jt6t+iPB(-=4Y3EA$@&nrYHbK;kht9pl$*oF|BO#(X7gLF)Y?IKKL& z^iv$#vKhgq=&#S2uozpERG@!AIdR}aF7=KL5L!c&1Rlw#tvJg6HIV&nT$8~0dfulL zR@reIRwq93t9g|!l)~kU7s1LaE0=h>>Im<~Yt3vhYaofYAn(D$P@ zXQ#tqf!MrWwimK9?G)O>mWHmO&yL?>^4VLt)koP%$7Iv$vwp17U1%i^G#&agPc_cP zWR(%UtFFVU!pwhiOm#4k;-+xHSjgUAAfZQ{b$&Pr&BeQ{lIOr;HqDt5{{X?)?ZRiF z?IL#H&pFZsVi^VP-yeQHCHn_CwnY?JHcE0+VS&Rz{aU7UV@h*hRJq|K3vx+6n0A@& z%mzFDjC_rD9!H+29LFithf-3Fqg$JXJq0(hi*KDZJ;%j6xfEI3p(}B-9l5zesV7I_ zO8<4^UdZ9G6PiGX&Hfm1cn=h9D!R z`3WwNZKewY2Q|5Nc7)wW;n|Lx3+a9KBEf5|!I%9Vy?Bv^QJ`YEe_ZuZ%K;zBN-uva zaiSIPhQ1S;`pkiunwWp0yeJ{4_#6fw!Pz&)A>}@`cHV(@zj#X(5Kh_M?}&_M`5?9 zA{3nu)-Es~zG8d`mDJzyP)7xbwxTCa!`a94>8oG&G0A8_r5-W&gp`iJMu zOHKSPtOd&?9}YuTjh$)LtvGqElN*2a#GaN!3hELnX_uebFP^8dCcHsMGFy}1LvfDM z7L`_o#ZUAeP8^A0hHu`pmC4ac1T-FVgIXFv{s-0M9=f9OwFy^_tf@3GqIXtLxk`j8 zxt&AKNqj)Ex>&zOPRd&0*cLjpsaH(XzWl|BzC&UK59!3s222Ij9dCcqu1-!gbf*_28o0v&QJcSI5fXaa&!Z zdcc@=Ziq(P4-)pfI)8>Ntg0Tq=#eaflJ7XEB_K%=c1jQDf+L%WeJ*!kE14~@a%>}@ z^7<1f8jiNAa^x~l6PYm`aU3s(!DoJM+&nuLI*0i;HY#?40_)Xrs7GHHTa_*?!%~Oa zsNRQgwa!rCXp(EGM4<;WOP)gOaj37$sxs3MmNIWR3H!w?ZCPPe<)f{0V$d#KwNCEm z^V__r4yEa-Nc>w{58n|P{VB!q86eoBZk|)YMjKop;DGT#aNd3~^k=Y1y|3g5aY;|x zISKfmD8ZsmCnM(;RP@nqVa4P9iyQB2xnF}+5YJ0(EW{I&-pK@+d>4-kzp87GUv?g- zEB@#>8Gct)#xv)JzNJ=FIK{n0?QH%Cxv?YjK877Y`R()b-&E zj|IC^C_tf7=fo*==3djHrA%G@LV!}1BCY~|w<-7jYo z--*4QW0B+tJFA1!3(v~sShq;z;yx~A0myvmk$_KM1$??52JGjHe`HeybwTeG6f!Oc zthpvl7PUWNGB2fhy$!ZHgqb##ULQc77nKkM!}~a~#M*+O0?Ozrzm9;(S4D5p8P|IR z+zJFAqPP#hQnf!Q}8O^-%ld|})=Z!-L zg|lIDh(s6DeS9W7iqC}KRmN()Ci+TdE_nR{>Z{nEscaQ8llncC4fSdYh}#;f<2X<}zQ-2?$@AJiCvjsQO-}Pwpp-B_T*Tg6mxp+E zNh#)W(8zsF<6NYaDeOJYZMVRP1fe+<7E3vZ@RG|lfR#LNmge{ZSP9!Fap&>Ar^Hy_ zk9!&yj=5#`8biue{)7;=cg6$1|7s;T`HphF+#v_`H!6exL(h3wH$pY4B9 z-Hd3ZZT-2NCRINfTLr!-lnwAgr}NmA_X|F3(qofVnf`EyhzzR=bu;|c!E=1D#Af4!7?4Xm zH}r_Vtf52?ft9B}KUxg!NuqnBda{$`Ch_on%=T)ejdPBUX}V;#gVk2La&MN0dY+m> zPBLt~?MW~RDxZU2l|Aue2@*+seQ@0pFrYt|a>Oy);dSX8#6kHVI;j}Hip@^nmq2G5 zt@=0i?$(>3^exNqQY&aIQ#{~3zv;Nzu28vwv_Y$NAZiQVn({mMLMf=;-#bC-CvsbD zJy)nIvI+_b-RB)kdH-O&T|UD;@)*KWuDQk2{Wg+NcCGe+O+IIZX74;w#eHd=BC=8B zquki$dXi$>#X#G3$6s&iAGs+= z;hTu4){+I-HYepr>6Q%dy#4Y0^X5PmV|4g4zsyIgUFDJC-irmf@c2Hfo1Hg7dI79l zZlq69Z44xJP!QE#Ti4(GbXso5-^2)bkW(v}lbNNg5`HP1=+7!y-Z>$ZXLb_-58pb$ zoxXD~U3}rZW|b)s-m6nvy7I0do;`S2N9ObB{DJBmpi(nh8gd%@t1f8gm z8E>!Obit(h>x27e>gh)T>wS&4n}1=x(s&oUa8aqGYg0jRTH2>!jyVAb zaLb^R9TuHBd?zx)<3D*r z4vX?U`MH2yoGYKt!9{6fhSuNppR0BMPu|vkY_+$^Sp_6+lv<>{m&wOHY~3-k96R zLZA^+zZt#!o^3Fhm>-*P2jmmmw;q5jMgX@4Fg3?%suKRn#F=wv%9FGe_)O2~jsfVvfK4>5!8?IcPoY9;ogFvp_a2v4)wOnvX zy;^8dX>ix;if0)*buA}RhO+P4kK9k(#)aa?mrH5p?gtU}y?taFj+f=x=5Z+tB1@47kW$fvMk@^_+-Vl8!TwB` zY-)y*!|YbuZ|(Qgb#;FL)wBHqXRS$Z{6=xgQnv0M#2Fa%eh0v|Un_x0cJ6V5?(z-# zDX({{8YkQ~+D$Ln789c`dkJ0dSd+OVy0R&jOZ>+Se1S>P;4y|C!xU^Xh zMGZ2pPcYFI`|-@o8RflVc(-rzKxBB z6^JFUdua#$8gP@if}=lRnz33+;?QWHdLx~qx)RG15#RNt@@L&r3sq$|)4b+vEo`$- zJR=~aXf2`wuau%(&9BF|ITZgUDq=Uf=ZNvE25j zix3S7Ly~QRC1b8->RSDYar52}e|*i^S&2?8MksZEaTI#~$bl$p32X|Oe6o#@ZTbc? zdlWBqV<)KxDXP?#Vyp--BT%vclkR82(#04+&s=esPsDwqK_xE^Lj9UDv^La;+V?*# z_-*g0DMh7IrISO2m(oEx;!7fQxF_pJao57fdHFP?I|O~VNZb)5Y)3S;PV@<898TVd ze_O=YqODm}o;mhHRILhEL%;ebAWS*p#{*llCVp;U!zSd_p8j7doLxXwyyor`KQf;i zQ?PR_S62O$%e~9BYblPOc$9^gQOI?%)uhV#3b1wbL@S-xMNVC66CNMlyLp~}s-2f|{T`1YITouyziPKJnCElbih`rsA_n_!jROvQB)Vb~7 z2f-Fu^W}o4rtW~d86XX;?~lEbfr^ZABr*s?OmyTShC48z^z1?2rgU5ps|^B@6QRo&3-l6&MWOk zRPAzcv42@nM#ePq$cE%x=y=y#e_v5#rkQ0|O#l;`K)c&@Uu>*&<`=QNwOtH|c~O-s zNjC$S@?xD7B$Igc%@E}Nkp4T2D$8N=(hMUu;PpGL=ZUU8`sFK@`5 zziH69TG@TMsjrkZxBvI{?uCTJ`IdKexhMDN{cP_RjVN zzt+Xe&mp2=oVxH>S?2+`Rb!sGCc!X4$18%HiyzcOZYT6C=qlT_6++tHJ%I%r?T+j7 zmwJvIb_=m@m~}8F1Z*di*h-r9x{`X!ze(7gl4}EU6NJb%f9`YRH00s_b$9lBYcW5d z`|gF;eP{o5Rt5(Z_ywb%SHTy)c^#;R$w#y%sKXt|3WMm-I=eK{o0da#%y&udVS6vm zzfd#x5>`jibZm4jlZf1jnFQw=v;U07FfQCm8FACe6jj{u7&cjppG<8&lw++Dw$b`R zH=R+g`)8RY;mkEgrps!dDuj(aN1BQlj(myO;N&iK2((OeO;R%du!kp;gl^*zv9hH5 zqh_Ii(q;_l;S$kN-jhu6yI~`&^Y#SwFJl?i>V)qNmoZLSOdZinE z_j?n8hQw;%fMpgzjc>7bP}1uWm3iIu?CSgFBRh z#vA^((&)b7&{>49w5lu5VLF6jnnOw#YANPLMzA6Fu(|u2n0| z9p?^)^duv+#F^%OWmgO#9CSR`roPgy)UE60W_xt^uoufaG_6u^UK^{sY&`<_@-!3l$wq3s55s1= zp*Gp*Z#lPiX%6d-UQ8fAq}kU~S6g6qt~!wOZ5P{CXH%3i&j^3cQ7qTnH7`-L4Nl;Z zP7Qka#igJXcWs36NVStyqxU9(1630q5sG7k=q?Q}a8RAm-C9)Q$8=E0^sUufp@QAo zR9hKl!|g<x;uu2_%L?Al-PS3r6n5mZx zIxTe}_Lel#!OE!*dkF2i4KDTFqWqP$RhysHl@bN7de zsqhQ@gJ0nH_Pu$sV|pM&Ym9f3^V~fy(B4q9<4eDBUK1{MxfnJFR+ds1qn3`|iPDd| zDODe_NyVieV@;b#T&3G)Z;)z6Ls$=D)c2sZs?Bc$vs^f?v97-?bUo1cr-PoTKA9l5 zEtl#H@@y|lHt20W*HzY=q20<5$kg0B{?U&-=frhh@9aXxhh7W2Q2@OL3$+^9U4Z04 zJ#f)w71+h4879JKNp0Apajt6#tM zg(%7i(30|oBOz~r8ckqAra^`6+w55{ys=9H#%`i(=HpDnNZ(E*K`^}&Bp7BC4d_HC zS>mwQFj`3)B#VMg_S!(Kk9!7yyS-JR0X|t8aCge4F{?wIej?4f5S? zhEAuw28QBLkF*hi*pL zYSJ6qnmB==%B6KE`4l|INxobMzX^Ecfr+8Hj|))&zE-nQ6*y`au)Rbs^gWWk<7tO} zXoy>CLC^vCGKMhXDW+A?4;6mWAOQ6iWA?+{B%DCNI|2PGx-WGyDC)=Sl4G~p0#3FH zS0%3tK1=;xt@C!9UP_tOWAXaCZZ#}+QDj9ZwN?RLGuL9Sd%Av)GeS0Pc|AtghEA+=ty~IcqD{2W-!JI z9JbN3du7YaEYj@)9eQBS?t8G+S{0AlA+*TPuz<)u&qa!_1*fzAuU2>??|?!_L5Kr z>ah|?!qKiQV;5uaV3hAeRLrz|yXOmB}Tfekc0@^32ZvZ#)ClHLD<8drs-P%Tu;(8+d zBQluTH=Qv{aSa|@+V&A8gvLwOMwK+IFLlvS}W}$+I1UGsa$lR;B$%yK|_~Tfz z$1rajy+?$yx|u9$F9VkU;ykPO;_RNmtELR$0(zSv)AsQ69vW7}8Vzj3oqXdPZVodMuVeZo7P*P(MQ3?bmCHSU(3U@T&e^QuSA6T=fCYEJlr0G%%O zMf~FX{y$hMjWRQdeM{^v7_=5NTE$Ehh%vc3Ci(F0)!@;hGyzdzND3=@6XG#t7VTCb z6`=~(`aJY7RD;>ydbC_CGed7F79osd6V|6oG+hX<|0JJ5PFo;$m;PQ z%gFd_Kg^zHFGlX#2mj9e7mly%SAN7B6JM>qEfH?x68VNk@#1{@8}oa`7j|eh74cLN zrt@&WG!i>P<+ZH_Q0PG?r;WkSvQ^)Faa*oi#%(V)Iv!Jz4I_v(rmNBjbaYUqtqRo7 zIa6gmFh*%uDZG(`t6})2#}J10%w}G79r8R(lP2cRt#% zZ-XEcwfZFs({2_S^-VEezJE?$TjAPvlf=IQvjb+aml2dd-Ar)ppBp$Ssvngdg#!7K z34Xeo(Z}&@GeG)IT@1JJ(TZ8PXe?Z@feSkv5b@Y)#)sBuQzb7e;8`k3e~~4XRA-)) zifKoYCiy0PDEI^}i>*Igvf9^m#^i~qye6ti$y(-Xl}6qS9#{YC(3&a*h4<)5#R)y) z9=cC;CD>0iY6me^n*4{fW?DV0VQ6@RkEWl;6o(*-Fuzf*ri_hRP(?$m%1#3l_ZPqb6ngX`!6T`Mwy9MYgO3% zTVw#7;(s~qZ(yz52lV2&*MlcvkuhX~9v`#R3FtsQExo6~jy&6|-Z))ClT#spYK7&bJXi!J zzZxVwM zbBBstk`^#;bUWZaf!uG8re{p%~u?Td$U0y zQkRzxCWCl5=n8M^>F_z%^GNf&!$#3zg6eur@6L^!E zONWSoItiFCMAUYieKnu5Y`8VYjq_}2p3u|!eZRAjpSV^sVAb1mxa!cY_)IUvR_trg zN3LFZ-&4g$Zlg%%gn(SFDRl2+9PjGzk#tt^L|f=}TZ>O1tc$&~jlEA~Y+}f6R%_o#^!l`7X;HnY6SmaHo+4}_tQU#n8(nv5#3FGZlgiP}Jx zOSh|>H7Gv&jW(6k8|{i#ztghQ(}rm8gh6B*jwVivkvqh-Kls4v*0%|@kJCCn8ArEc zzAgo0)b^F+<*%2SpbFRE=sQ7RhQ0-p;BBjGu6i~qs~`fjDsC_gnR^nj+4{{d+LVOL zk}FL6eBNcyXek)y(YN};jABLAdApwchaJCge!qD$rk}a;`=n)mITqnLTpdg_ zFK-giw!C&LHsW#9RHmJdK$WfB^c90`rQP^Vv!XAcw~Cmj60YYxp&kIVy1_oe~tZyq2of-lB|OmjHzOHRXZ5E>MfI3CNnb0buZN$HE~1Y-=!9}>~+8zt=N$wBu#4)p#}+ijSihF z(Zg<{Cvz*+DK9#p-<(g}A51^+?$hL(iLZHJZ$`{VS-khdt0k=nshB%M7M!Pk^<{Pw z#?9%HWZw!C?mN&RT;o+Pc*ObKj1O#2sE8TKq?&Fy+0@U@txBFL)1Xu0hAFL^v^5fS z+hakzBsr}#D!Chd_F2d470unZ{Df9}eg#n)oXz;3ycxQim18x>b%*2?l??qP*JC|q z*XQMdRf+U(1Nfbocy=|-UHg+Bx#S}hxnfT~(C#*goJ5;z@8!f>Cpu(S&=K(5V*<>l z(RYM}Mtb4t<>z1wFxr>l&O_ZxWo#02F;yGOGo7zsKi!*lG^5XTP8%5HXM%7oKNwZr zH7I{+AD)(BP1SCp8k>2vNgsR;`uqG>;A+?T83$ywE?%T(e&*Y&5~(Ug8^V0tv3|(XE&X!NjS0Kt7IKm^oIASxd+YQIhoYQ=5>!y? z-dEuOWRakncWurX#LH|I0?TUi!(yNc!8cBfDu`Ygca2TU_8L{M|JH$c!>lc$DYv}Y zpX4?>?|8_ad6hsEgbuzxaInXp(0Aa3L}SI_3qs)Bz|E8P1?;g-X8Li_Kr)xUUPTt& zrqbc%>C_KXT^#DMz#Gi7D88MC+)t?qXK(#khYv1L>ut1GrOx{fRj$5MV5v&0Ir)%ZXQd&v$#N?Mjrp=d>nXT z%==50hFJ^1@Uf|xae+-pHj2o<^MMULF0jFSM^x9N&|uFanmd}qXC$#{ll1~T;^K`) zHR9X>veDZ?fodz-Rs6j5cZ)x{; zX!}3+kfB9y%B$~;vj+^?*}_!eU*jeex|{FkCElUo0xts_5^t+b{-1wSzf5eyVO?ef zqg!~?2PyKH2WG*J=c2c3SN6B{>O8GGKfk;@vi|@oXQ8jExL6Ch8*?_Cv9S%i`Q1V!%)E#lj zHo>K;c*LuAWc_%r)~<)m#vVMYfBDb8Z-%+rrzjV?0KSu^Zp{XK-Tl_vP!eAp|3jeCAHg) zGBZ#6;fP3o7tw6!x*q5Kq-U0OUSvO?ZPjdfmpOSvw(#yQpcTY3`W{-Thmaft9(OX4 zT{60zh@dePDC$%`rM3>dq8*R6`}Z5+O273uGnY2ky1h~6&rM&VVPaD z-0z!HnN-VIi!J87KUW^vs(+U^t$j_(yizQJIp|@I*P3Y_8)wsc|Jbh3FKSx+)JS8^ z$~7q%x9P37z$Z*oAJbsaq>7BUl%F4%GZi~`{U{1WPe=kR{ruFha;yyTT|uhCnu0$0!u+1+riUMYi7>sS2SP0Q?C9f z@mGjp*V(azZ>}pjs2f{;TzJ$1#a;h?D-ML_sCG8I-$!W+1Gif_HIE1EkdmXD{A!Fh zSi2`}Dt}Hdl5g2FET~nt#-9gj8ya6~ft7q4(JTgu(uoxbR4&mJz&Ceg4UZa;?ZCkNaxe6Z@gm#6e#d!pR?)smSv9>U7isJWQC0pLZ=~nEo(V6vt0(RBJ ziFU#9&!WNZ^4+N>K7ZtgKEH#sX}HUk2*R=3@b9)id70zKaYeJOb#d-2ZPwQJLj|lh zTmL|$YMZ}(UDjtB=`e{CaT~r)Pp383?`mpn6)F9HRDE?=li}Mo;8ai)HVhEyR6t5V zkYB1y9!;uW%;u0wG5h^+WXY~#E)+iWXNad3rwC2HJpKxc}T3ZH!YdTZAw3Ggxu@Vr48$vE?@aM7u=MX zwOr#cER@XCz$3SU7(w-3k#2XcBnu$E!=+4M6;eKrNz6LdTgPe7g{)V-o%>OH!m=lB z9?d6`)#%BXM{E%kV0-90Xa!g#l7W&PI6U9CmJ#q9|6?)msBR4YZAe&4Bp=GVVWR!q zIXI+A{|iG^@?*Zg&w@#bb#E?E`}g4S8Ox{_(R$(SX^P&B*Df=MQxJj zNYYut|K>vv7vX=`QJ+fX>9{KvbPaj?_S6w+noJi|gH-8h1j z3^cS>hg}xeYf6@Q5EWXUa{Bxm-)ICAloBp*B*~b8?@`_(hDR^MHY(SW5i0|+!r#@7 z-};aHJerwKQOlM(E5bgLz(tb^l3;f_vrdhgBa>OHZC1 zSiu$!IH{oQ=ZNV#p9VNc0JISLr{y4h%@uEwU(Aro>u;$B$xGf#oKGJ6%~7y)z~I43 zIqcFHpmkk{vd*s;%Is5)EYywi0jch-)ssq(Qodq4!WcQT^pAOHn-1Pp=(AaSMtHr~ z-?Ld2@-?{y(%GV0)9J^{%L5>KI28Cbv?V30Ido2My=`^e;L*a8~uR zt>U&ne30Yua09J6f{4*`!Yorrjf{Euu=3P>45l)Ah9zSCfmx7>UuFaW>Et82~0 z$?tFWJ=#U7xlWlv4nC*S!Wo=A@*!(^W3fk)=s7i~Lo``LdifH6V4dEsy`+6q!GHRB zMpVzKZyH<|KKx;AGq9rNTGa1#v&y0Pnj(VT*`gg`zQrFwIVTQQV^_>irHJ5!=7zk} zhGoA@q4upG=wF4!F`CWqPxN=XW)k7zwUZjI)UIbw_{2;n#K24;PbKrF;mX23?>Fr$-+j;CB1_E^k@_=0bLdXq`Zl2obH;=)0Oj+FCAzbPG`&rG%{BBjzt zzJT zl5R9-z*4yYoZyptqn}3>PL7Mj>=Fd?eOUgKFc|n&$0a z1zhz_zW+-56NTCgdcJjjljO5Bx2`3W9=vJ(`I^^>Pp;vCXJdW&M1C#aP6+-LE>>bg zYEJY%RwDJP(g7so0zg9kXE$0o*=bbG6#o4q)Fqwy_v6jK{VWPz2&~Ok?~R1KjbZmKR0-Vdi{;}Cjjt)Zw4t|h5NBIs2o{`gKiAPCRF*tr zO=m-v$)B^Egos2rRvSp+k_zuFfiKMLn5k)RE+yAY%xS;6s1}Pw)4r0M0Ad<>>(p__u1Juv{9H zAwfxWG;tD&;|SH$9|sNdt{KY2&h#_BSiG5_>!0cMInuZ-ac>f88paBHNFh6s85@+G99F&X!Jt1O2*`kzg| z0mKu>#-4&WY@o+{k8^;_n#o~*bno76PIujvT(S9)!xDL1ieEBp^L%&%*Rr11?J9d9 zw87(c5GdD32rQB7b)EGdxcp-CI$-;T4EO8bZc}m~4~rslHpbjLed9qj1j2uDK<=vPQ7NiR47IW^pLyzp-QZ@dv~4`V@oWcw3pv5SN-%sMW7n zVHEJ9YER3KH_s&Piu3@lj~2CaVT#{NaDP!aV=x6ryT@~Hh$P21yPbt!NwD&-8~6WG z8%Eu8GP8*4TH5g|fO8=@5fjww(2eDxr0Z_|pI7{UHog(N&aVR6qzBgcIMegGk35y+ zJr0Y!+7k7Bo6P@C5azDS&rj%qRC+g&B7c;_~ z6SiXG^ub4?g~eCY;0re{uWTz@!KqR~w|KADqla?{>ngC@z1aYWMO&Mx6qH6(lo|W+ zJ+&3M!eXzA)%##69z3m5qr0c?Yibx#(u3q-$mfx;nT#KEE>!*8h!JS|ooA>sU_2wP z6?&L-Qm*^N|A~xxKRRdCg!mxkgTc7$3#T!sHP} zFucf)p0p=@F~uB?)C=HjP&T;o>*^IRelDS=22RIDDz!o3@1DGa4sm|B;~WO~Y;?Z& z#_tc@oYK?KsD&@+!s|YG!mg7)d2$jR%WG2KJfDkHn@DW$Eo*w`275v-2)kvo(^)}XmrixFE=$okau&`A0 z;U%6UKl4eqTIefRpmJ?E!x)Di(8n_e6DH>8XJ6Ml@AeuG+D4U=C{2ac+bhO>#!lT! zsijl8VZRS0|E0g}mHE_8U92FU?aWzV$XQ7TWMQ%>U9@EwwOVzJ`T{jg<&6TC zxKI{QRbjJuw1<0U)7$K3Ot%l$89A&pd+_AcC0eE4o<^fa z;Jg8OHDb?f#;hq7jQtUnJ$74wls>RV@FY#Ht(D8eH0Xnn=XopJHp5DbW`5O9<&Bny~-6HcYf&Ev%gp7I_Ip|IbqLJL%(M*z?4(p8K znw%n60Vgn48~tI*`HF!aazg_jsL9?tX`P9(0!apcD92hp8)JzOh%EXmKKjvn8PmZd zBecVFhTORDAiUzuKrjO!V@Coq_EkVg5C(1y1{JgCGSp~U&MEF8!kTEbot%nF=ZA2j zr$tue%F703W#Rp6@6EJqX=Zx<>ftvUjh;H6>2>#hi)b|iwjAI8R3tV7+R7`+RG8W$ zTbBW{?o{&mbcJko6loz*muM7sSA4>E%=6hNYQbQjZgEzQF6)8${pDS8pJelcLc$@< zvc|+JZlI3B)GSNOO|g*FTDOxF+i-vAD;8i^acya4*F#!MUX+>ZlT5t0tDZ!RYvw{O zGuS&zPPTxkrbv&fZ~M-5WuH_WNH?+WfA%<6VQ2P19&fFv*@LW6_6JPdqMV*)-%TIa z*^1`X#}KtP4Kg zUQh0emhCCf{+9lGs>A8TK@R^W$xeb#w9MV$*kLGY;zz>{%Sh;Ad7!K@K2eX^6$+t1}E)vQn>=wpVwfg zxrqo=*CnM9|NTCa)~0SJQa*_;?5!%KL$Pnt8}zR%j=kf5kWITEdLR8<2qJ z@AXfjVf-V)9`^!BnfbzSlMLgg#Fq|nN;+FY4HaUCmFR1Y|Z!+rji%Uc&NQhTI5U(G}ZfjP=AVW4avLm}kVmg_XGGYA{c=Veo}(T+DS(-uy*b3vYuH-$G}CR+{vk z(}elS%ZgZRlEQ02<6Uwv)~@ol9;S<35^y7fpZtNP)J|1rt~WJf*R;X=hu!9XA+oK1 zc*HXPElhoUAM-iHmAfO3l@JLnsl{Jtm&ZP;<1^)uLu1K^$(Y|SYMhU%vI|WoP%nvs zYY^ck91{0v{l7GMx*&<6*kRf2r{oLdo{?Ak>e~;A$56zrHFV)s zg8izjf*PBs%n6$Wj--#1J^dplxiTQkv&}KX7DsaDNI<7%uqu?A$XftOxRT}N38i@v zo_~D1iBqm;FSg-HpingZSVG^eW4N`@C5f5QI}kY9%lc%{ue_7>;BfVObGYZEHpm4G zYy1P{CuxYZIiv|y0s@bcwUOBB!Rl`Zu-A>Wbxd~c>_8|dWn4s_Ah zod&MZl|`1KfqXq4%;X*FBtuj$PV3p~#8;|}!qt@FC`!FYkO9vqMLJ`Gk`bqc0W zi>q%EEZ`T#LF~V<9ZEpnEu&C`1v;d`S&GZ)`eeQ+U`NLcZ~qjc4MAjrr%sOiq^iZ^ z3fV3b*Ag)0FDQ1N5L$B#|J-2*dTf#oNr`>-%1k2_E4DpfcwRqXFM(-3SobJQMOQ>T zwZ6I`R6VRDoi88>BZ0$`jA>C$x1Md3KCeI(m<0A>h=aqz8*M!;>sA5U!pdPAd%+a0 z#7&!G=^ylzS>FoaMUZV3s%o*k_ND71i19B|wI^s0d~Jg4SteAaYR&67Azx6B%hK|# z)!DebVa9yuSTsKV3Fj&CS7`TAgPcshfT-haCD!`hDY10Cg)laKeGU4X6_}G~=r&&Z zG(_EFeyHH4VR@LWMW4TyTw+~Fa(0I_)SDkE$*s}tU}_J+dT3u%#MmlU7A_{fieH8A zJdZ*>39wz4+%(CAlkr|WRd1cs7;Wf!CJUO_k9wMG1|PW(jlsUBv!2T!z!D!V-vei~lhkx#nVUqoF_zChb3NgVG3n^wu?E9AqO4KcHL zI&>5J2|LnQAqgP%zb^s~a$C@-K?USH`-AGa#0j0YdLNSGPhQAV?zn)Y9O;>0Ynwce zew(Wi4hc;*1JzdTcU03xK9U^Ft8q;d8R(4Unt)C|g%UfxKfC|qx0{zJ)#X`@cOiwK z4IVXzEvPMv(vDmxhyB#9v!RHZ#Pkj#i3bn=a}mp zcP~~JEwXU22mU$xdGCP4`=jE~jJ9B&uw+wes_w|G1jV5rC^TunJnjeTPYMei?o-d2 z46%T;YO#)P(=NU{KD3`p3;y;5sAev12GYehsFZR4A|ba9u@9X6*wZ1YsqdT{4a^Ub z419ijt8x37`RTd3H^0O#iy0DLT6d4EF_TfvgbVQ_MX@(`%a3Zjs%kLJEI@n?{FXXwT9#k3kOZ&vWg37qAsp`r&_qSTWroIYRTpe?_~!|G9vvg-8t*$?ICd$xL zNN;zca4>_}mC(W|_PaK&WAhWUOEvN*^KK;r5L;63fSP;lDQDPl=)1-b&or-?wP*=C zo0%6jg&d8-D`HkvSsO)>)&CTNFFU;@kK6*6fWM383%HS15oMk%R)a}m3QWJmFtNNB z26Q!!r%1lFRbpnGBFunErou-F9Q5I8P|^J*com&C);LFcyohKvYUu0#dUbv0%*j*g zFxd^p`14;B(X&B&zh3Sc+sMr$xkDocMkKGcj;-~kswYnhn%Lz3;pEa?Ij67AC8WNg zl^1&Xt=Bk#r1<`09|!8aVv=V*6s`TddmHk{khzW8_|8c3HyH52FL-relAuuDY_%cm zL^wjonIT9H=rv-OrYxMII4T!nrXT;%n$Y=#SK$6u;c1O{Z?Z$kZZ#Rw)WUD+t5BN?(M68hv)A zO!>AM~#U5-r?`x&E{_8^9v{G zQD;9O<~R2k6w5_@;i+fB8}P36ul_k$K4k2M*f^U;4DsM}yanfuY_2uo?quO7ZcQnJ zVu79`VS6c_%N~H4H9QOx4cbm-8C8v1ekUK+3TnNM$Lx)DqgF;izNBYzQ}x!J z$Ii0gMR$$eJjq(ax#^*DT&T^vyOAS+-Doip8W1fi=-; zsaGC5U>q0txQj`$Y!L2?*?nKN;^Wv>`DUnHSd;U$C$Pd;`S;NZfCIiLV0fbOg|l$O z|InBmmg9O_wrZE-O2c7yBtB%x>@BvFFrY?jxodxTr-q3!Hufx>aT@(FIB4MV-!{DP zrwU=?lK*O3os*gelb=1IAXp+p7rZ8j`=U>hnmzvrYi~gg5BQM`mG_{P?5LT^8M?_} zEsU+=M$2(#b{H-Ge_(}!3>CWYxd(qlXAPJ~scNro39jgjTyXx(Cc|SeRE){_64${_ z#*R+pjIYKh{mTflst6nyN;zb`6s%6%>B+?2=JW@YElv@jX+vNP_$mL0N{FWBiDYo+ zG(T7vpy!xGmxZ%ze2`opvMb+f-FHUG5KAiSOz`>F!#h`9#Ji7)14<(6c}Wa2Zr&B` zgFoC!gok8@JiH*U9*Js3HKOwvoNpAM!M#-{0rc?_c@z3WGNXq`)gO?)fwz0|yj`jw z6X4$wN>SBePbfmVA1{ndJpMKshjq*_mPT2vO?L@<5vI{Q3ibs3-7dPUbh)Y*AA?Z( zU%GV@qYg2+)Nhzrj``UiO`Qygyf@n7qDDDyZ{&b5&q&sqt|c4Fxojql}unX>H72MRhXqst-nD3k~Fo^KN@kin^z29*w1gMHhC)=-c@bQ9`ad^MW?5K)RHL1LhK|p+W1lsh z+}M!&o!ifZG{swGQU9VkH>XI{-F9ATwftzch}yUPIYKas47n1qa9hm9>cstqDDVhT$@MxeP=3g`X1wS3YDv%h8hV5r zzT1xT^$k!p;@4)3z2C^`jRXBzeUND6#|`MKxO4Hu&46+2253Q;)I`sBG9+;__yH?? zX63=~IcQkY6N!=kDjWcFj$RcHO`T$G)5qnOp+`;pwu$wjUU$It(K8aKLU;&`pWJ;6 zeGndyJhmj4k_${If)YB?uXSt2tM#arOTe>Z(yt#yP|)|3i5puPr4A#6s&aHO%kR1S z*xaY!ZMTk+c&M=FsO8@zH_$FM(=>3ZKj9Q`7DLk*YjFzphM! zPO;oC(=Sew- z98J++?$w&0oG}58uI2)ukiH=@SsyZqCCK272Ao*2Yc3(7^rtM^{3Mq zfk_l&yR6zD&(Qle zs_-jKL^=Lb%}{|Pv?VoDJzCkbwwXtM%8j_%cKTVqiwZe48VmFxofWmaL}YR-5yjUU zc_JAn_^TB3B6R{Q4g<@A?v{fE{ON;GK-$1x@i{cTOBwfTJad(sqxZs)OoBc0@`SVg z1kLja)UP{3%2!}&o%*8Wj)yWSdj4&ep)o}wGozb5GGQ*zTZki_t?^s5uVFp%f0u~B z4W8=>z%w6@I*H;s!HVC5xMWoep^43VkqdHD`gr~?tt~g+RWFp{-Uvv#Sln&dggy<} za@bIp-l4jMJSb`BR8F1JnJf)fg)*vE=05;Gx(|4`YL;}D=@Uh^;}?IlgZL>Os6MaF z@s28uqVu2|2C={}$L*j5iCZhMg^|t65lqe_1bdc=JIEFZ-adx^T_G){&sE!p7HV@V zRY8S@^==6npGFbHlw#`)e<%fY5{}>6vB<8#%O5HA5v*R;*?!)lH3J-G?+yb7m?dSm z_gyy2*xW)*glB3ck&TJ)!0nb71ZF%=viS%a--7su(qNjv%~N1hqb{6felm>{W1TU8 z&oU}##0g?H<%U8h`7A(vf?G_$z9O?vm|2mCe50$8Pu(Z1ySSuAQ+ymAGx_xWlA>x_ z>w_0aa4X$GxEGuVExn6>62M_~!)>jjRflr#^~i*>B%Ok?xanA{EC!Ye#a8 z=v&Md8YRgV+~1QK9#CNaGNX!z{^5y2B{~Z8@B2ae%pT_( z)@;YUXy)D)&K5!S{+wfAmT-Sw!*NpM6di4MiB&9Rx-tCe#zki2{+#kv3*uirG74LQ zV5|i6xBo73@GF$UbwKY2oU^2}uo2)=$8#gGN7#DZ%}cBp46GkET(DUVuDpC|Uuk9u&d?J}BK1#j`PR59_*6tfu+^mxo%m+N%U%9jU~@S|qds(LXsVhOFWcjp-8ms=yV>BpHB@ zC_KS1C?&cRZA8H`Hq=!4)!dF;E!#Zlx13eJg- zP8t_b;5rkk8+b{Y)Z?lxM(P1>2hHejHiJPoQgH6hY{Xc~BZIXyOd3@8=v5Z=T^hhU zxdv}pIl~m$4hQ?LU6B#R{HjiJvFgyi=d=1x!@Ks^C}|X>_C=U^LTD;p6gfZD4-cz+@Dwf(#2*TMFk^-ttY_=+SFIkK|@9<_$XjyCVA<^H-${?#Y!4MZ#a3 zB91@NZI`S`oDq)4yGE<8BTh9>P_BSuej)lmMRr_=V$@F1k4?>O)t0%f<~few%%dn}a+)n;r}F-aOU%kkPKjw!x!Jbrc`d_l8YA zqJDHk+$p>!J!_V@FZIIezJ;8=d|5IauT+o;_+wFq#y);!7#G2Sr>%<7!R;F2~91m1~jPRion?m!u zOXxqcl4TDbiTS*4;TmV>AN8OmKH*7}JMw(+dP}@xznJ6Qg09$dLOp+4IEz4qt3-8g z)r}#XfBNuSsbZn+nANC?rpZYaL7^Nafx(aQPI5y$Q%}ve>V?4__H@%HVf)Z#%&a&z zxUxHu`tEsd&dpJu4@Ef1cqq^7r=` z8MU)%0`d3iV^w>{YHWJL{4p|VOH7ht0sJ3TDLi)MN)&jTcWccG@A|hD$M>wKGvpYR zde30G3igu9+kXgh@{=9yKF}*2%qN)lP#g-zozI6Q*u_09b-T^FQ}dzvxQi&a ziD>TH6!!y~+2%$`p^s>km&sa9xLT=sUyD*M=F+>5DQm{Jfk8xHGRn$Xr(7Kr!~{@5 z5a6=0BAU@vk?;1H*iY)%5UrYb%reFi{GQa5Imj^17IvLOA-G!>2?N}56|MA5IF2w0e<2RFVlo34#I~HyXsb^I@YQ*4EaML76h*)(M>01o`bI?@#soHvf2UYPNo8lPjVdGsyj(Q1?!}4Wa~TMHyZ`8Bzp1`BG$U z6%*AC)1AAclHs3c9xtQHW%1VYy@KN@91fZXE@(IxQ%w)kdNia=&!0)y(xFqMf2cBV zBL=tE_}39B${9>Bi~Di0jV_Qo)>7U7KO}~mAfi$nh!g8(rmv`&hHYVAOGawvn>C`G z(IDfsp+knpfseKg+^n|@v;O)(&GA{H#p&0O?S&^>Xab;avI${wNCGi6#1!(Hhqjxk-}&N4jQ#EeeNma7WLcngO(aJ@ssYvcQvE>K^zGm zf$GIgr;}url?eg+J1-c?2VZOcScGOVNpdetdCLdvKfeGuq9@_Lx_p#)?(1{(WTBwR z+WE=R3+h+>@K)el#E`6^>=7^|h5(ut*juASaTdyh^`|SSjGnyIyNwvNmY?Mx?=C!y zP{|PTQvT^Bz&FH%%r>JFT^ZT-t3k!KQsd<6n>wm7@?L>kCa8iJDZ@v`6HgGtTb1i+ zP0&|?=XQ40W*h;5*8j-2Ep&#c{^hQV;g(p&t*a@Y-Aslf!=DjsR6$J;NF?)$_uccO67O|>H-)jWOpCvc zfDF>&ahDRyYuD?TQ~)#@5~|xR-naesT77^jjC;PknQ0; zDp7JAQq!@j-qmE7=O3%kYgOY`s`C`gm}_pBq#`2|TyV1Kd+ro+3{Z?KFJ?d}qX}Ps zWD5wn=>mx91K^JaJ!4z+R67Qda?y*5anz=sxpwdQc?!y645TwW;iSF$v&v4*g@nx$ ziMYU{cDA>NbfKXV?V+Go8-Bh!_)3-cnV)}EUrOctP}F3|74(fMnmyu2)Ce|+E6|CL z3J#)L;i^f~Hf5ExvqKNn9S*Tml@ zB%d4n-i(ujSJm?>M-_sK%G+h#qw522)Q;+<)5)G?a*s7x6?zFtF6iL*o!mk*x7t5d zzH#s&nwkZ(bi2qA8PjJN9^{qQ6qQCo;FthjRtS4~EZqUP&v zo)KiWr-^SRq@egeaM@#WV2v9i>Sn~WQ0F#?miDJ z1GM<}zHdwbn4?-?1AGuMt%;eOh;60Klw;Ne_l(MPE^|CH!4~0_rW9DG-us)vkZ+SH zBIAsgqGMCNI4gMpzeD6}nLneCAL>hTnd9U$6Z<#Kd7_Vu7)U01Ldu%tB07w#!{mDc zhQ?an^QOEBf2VpX%hRU)$HHsIS*^k_!?I-~*vyag31e?qw>Uh| zx}4;z)N~`qER_@cb1-i*mTbBrsZ0D9>2j&SOOc9t!H94LcyFxO$2XGKk2p5c+T$So zPuVQ{dHX**cewI8AjwL1bbZC9FzGQ{0f$o6#oj!(!55hq-pHL^z^ts+g$^aZ{*(8n z{3`F5X&PEKgBEu5P?Msd4Y;|94fR{fmFwqZv)wtGlzkj61f|FcWS~ScB6x&K@Op8H z7Y~t|!rRGC>eV?3pAp`k5P?oEe{t$h@tNsacfiV-#?n2ii__j3^FzNGVpOnESt)fh zbGZ98e75mz*>Wsd9OPr*0~{}b86xtzctWrZ*?!3Niq6WJUFH)aM|4y&zn=R6ed$w3 z)H)HP8X@PnMXISai=b}Xd#aqYeYr(XS|GdUbabOg0zyJ5U2pOa!RSF4vn~dEtd z?v|bRx#iMS1wEn%iA?wZE7^NEtvl^uMcgo-1dbk)&-+ZQwn3tW;P|1Q9`jl9D{W@o zVDj&Yh{BYIz64toPoGK475|a@bBfZdPAORzS-vEsfrSlxxtX{(^Hvm6T?g zc@Nb1Ubcvl+6H2l>&x+8PhmQNS}$MjzN)J;XG6gT*gy|i+5$&&J$h@^5BXwnS9Njm zugFol`e?@zXM~ZH^UzFfFvdC@; zt8lWLZC{1D+&_D`uhUq)(z&a_KNXLDk*-pux2hBB4le!kP^0TXY-S`WW=Sun@ z`BfMXcvAd)QQ0hA5krqQ51Hmy#|o3ng)gaDf_aSr+Hg^9#`N0+#m_OK7va-@O-E18EeC; zz2{i|)(agDWMC3ds@pas)kO?h;f?|+Rq0jSTK|u5Cg&Q01v_QBosvrxxqH*InA1!muj#&i5JZuVa*|%oBl^~QN z5iJINN+4|2+1!$qI~)Cb;5^mhy)`@c%k3$&6==)af&c9O0sl*cI_R<{jO`RbgXuyosPPY!4N?)p5%5}2k5KvLJ1 zzh_luK$+$`93c?(e3$kUN11mal4u=VL~HhWHQ!wq!8lMax0_EOS$eL$=PomVnH<7k>!)gO4rWN^e_a^&f#UkkgGEILnv86LwUQ5&>iMCKTGQDT`piU& z3hvS)S;!*VAB`dn6tfK7YU_lLrPOTTZ?zFi2U-%1o*{MQ-YQ!{@7|o}doXp|z{Q zp0%q=ghaL@+B%$j3d{CYIDBp)rp1de!5un6;0HhSK|VT?th8&f#~WU%ex$#D@{4(1@bO$= zF^aG~FuIG2afYYUrjSPk^9|ZdJ8Li66Qeq`fs8$7W2;U7L2XZvPT{o>bw@7sIguVza#KC(&@pw^aIlD>jk~Bn-{($0#GF)YYO}}M4V(r&Xfu}aKNVi0Q@fYfBbjk61PBsj% z!3r%ui36UaCO6ori8U89P_-!K%nnO7=!SWx2gyEfCTtGmPicI8}**>FX# zmUSuC)FmHoR^-1j)y6n1C36cw=WPu6-+_#0^uu8_<$H|XsE{O~1ys^-qx>Xm4Aw3h zvFhh}m;@(}bHb~o`(yWeCViKP4%J*OVhCO8By6nc=4ZOKyY5B$PCd>2gi{}kwV?8? zMFYA*x1?jAfO8^!-WJQYeP8udiT&fJ>R83~>Yap_NyFSeCtW48#~MN!(G{Q`oSGkkotdfPxjC2)&FNE2kK{q)ZyOch@vIO{|#4T}fEXaoKjvWZTQ$$Hkfdu(`3HR%6CS`06Y~;>Nh)3i^SKY9?dI@M5BF-t-r9Pr)$h%Z}-)qyLVIa$M zRjt4uP4*`pN~-p&ZkQCK<(2Q)CSI?SP!1)2vzr2EaP3civYi_BMy~p@tjIVC9bnvQ zb6^qU*<`ub*6JV}FlOy4RJc;YOnJ0n;1@1qMSt0k%$sZdjE}=qc!fyzp}|ZTL=kA+ zi>pRRDUW2Q%=d_U$U!aVmc8v+zfTsbnUScpc?NhvNHI;c_8)ua@+TB_e?n@MUfI`e z*DQepEsH!j^qeJta5i|K9_tIP?D)Z2i*xylVkw=M8+tmI?e7qkXv^JVdvs?W_&}rT zKZ)Q29Jkvbdi~Esu>h?@NAnOzxwzQMO~!fW^F}6q7x}TEU8$7LPHuQP7lwp_nildl zVt-CN4Msmg%$JcS)@uTpK_agF1^h5-J?omE4_wvzyKgjNi|q(h({8Hs9n$YcyI8a6 zgs=fP-v205QXKT)$B2%{pBHsik)ExH$4#@6zY>S1pe5byGGGcSqzNA(V1*}e%9VM| zgTm|8v-=wdDszU)QU2${>aIF9ZALFa>y&F(c#GtQ0fX{-7pBwn8b~u(&TE2OS6ol1j-BFV#q~3Jm9Ce%Y4ZRWD<>Fs{;G~}9 zZzi6C_8YuYfT?-2V`New0hz2ex4urwt~#pNBhw*N;tFm_c^W~23eKlhYniMXA5a~( zdSAT5th6rXC<7i}a89fl;yGEy=Zm+f-#?Z3!{6E7yhy*Cb-|dcWOVA4ME!^!f}VOt&tBojIN`#feT8&Oh8|LxLDU2U zl#stm%ga~GzL{iBxHyPm9BIrFky^zI-4NQNm!l}sV6{YlY)3-~3VaM6`+RNSN$ua1 zQ(BAK78uQMq09@Pn1OT}1suG*b+3=*N)Qhnk)H-lQ8?RI?W^aGc1I#l|NYUV3&fAj zy3wpD_#N+6WDB#fBpYLFrxG{>Z8TpeO*GKu$fqKY%^hMMs8dz#>HgpiC~zfhx|K6B z0B~jg&ZGntLFXQDk&a+u&uD8>;^JttCRypBh8Ti8$o(AACAV5?$7-9X0^}0rejL8d z-c<9*31YwJcy)VMerxF@=yPw*8`hW~;-rYyQ2;Io#fWUY;b3QT!Gv576$^9jmpXE) zewSlxleBL;i_Rw7Ga|j&FM|qs?r6ly@nT zHz2-0Q~mq`E8IC+b?#WHV4^%S^bYNqx`3D0q(`wm6mFWiPj2Mq-9R)tM)=1tF3&%r zw#N0FSc^QGVWicHpFYs&jy zTwWt>u7f`HdhXTr;yL2IKE*9^Q|Sj4^aB{L(z6@4aLgJ_tS0KOhVZQf)|v(3hAyA$I4ME=zEutoT9*KDF0NY`GsBU4mKYbjdp$tMfRDj+&$kcPlVMYGW&V@(@&YEas~?0oqK<{+a@*Wp z&oLNqR!8SH)nVnP*sCO>GgUa8{C;K1+Gdd`WuWz_R3X^2Z1dA~9X87S&sRS*(L>`E z4d6bzVh;ij z>`qs)G+foG4%pr+5jtzWv)m*|0q)+o95UN46l!fPi?82^lReD~Ge01fdNHhB<;q>s znvlav=zpHbFGphXC6B^1YhiF#3Y$QO>XMT+e_4&gj&gZBwZn&_Wo-Yq#ff9-{z~`D zSY)|Sq`z2owHo7WIk3tRMCP?#Q&mg%PpCD9Vgkv3Y4nm0*`M9FY5qWK>6~n>dbFPH zz!Q)V*wCUHkt6qB?U-|6s#yxC24qRD=%wIyaz?@|SvQgY-lW&**Ql?4^~k%tg@H}~ zpQ5fkp6UPl7e1kqOXZgPEq$~kh18HcOVY({B9f(<<$jq_6qfrv3DHH$ZDy0pTq2jy z+{ZAvl*^1T!`y!FJ$|41?(glj_v8IK=e*8&p67YKjN5JJgiE5d7_)|naTHd3fm5hj zF?nEJXSX1One**|0|oY}_(9#*YyAZ~1M{{pWm%^hzNZezIeMWOV3T{p&7}dg{qh_T zHWG0DOT~EXNmoub1L)PHujIaddLf&lr0EtKfp6~)!TZ7+(!;4OO0zV2AA!pk&G5n&WSgbXz;2f zz!NwISRX_dQe(j58m7}I)opOi@*8ASV)liCSoo_Tj8#X;Z8DbunY?1DOXunT#k&JN zs$bKxd^u|$1zn@G++;VP6VorlL1QNeN4_(9qxVs(yCm|N&=OFINB9GP;3Zc$FrB_= z((6Rwr!Vn8=^RB~IY6h{CU3+g)=@}}ZLw2D$=YEM%j-Yje{7a?oI^~==2C1AKNLJ& z!lWByeJ(kG{cWI>sVc$IB`x{{TqKR$>y!)guaDT6a7Zld^8=@8sr#M)$n*~YyO%_? zEGkgbD_tQ`ScxAS!^yK}*JYl?lTRWXU7iCI(@V0lByq^#_g0dwRP4D=Hpy8C8oiH{ zIJ%-@9{?HW3Pu$HnQo|yDf4rp&P5S(m?^>&`u*ce5cB90MIc3na@?kj9^1eD4-z@? zaN2^Ku6VeVPg}iSO-#{xL)-jf%5{2BC$8m`zgwd5=45-3YIdqe5Y1Oo)CWXK05}ooBY`8-A_djnx8L4{R@cl!x_IdZ95c&RZ3v)rj znZtcAn8!L)Q7mSZE^7nLe}ho#CICq0Ua(8p=ACPXl%gt(-i<}rmk^}!9+0sdd4*8W ztd;*?L{xA;N=D?_(QN97Aum40^wcR#;5f}!{P060ri9!w=eg7C>_%t~Y$pC5j(h&F@qRrjS+2lWP;82Ay-(x&m0>8E> zJHOJ*uU147&sgj-bW&M|Cr`=`z*>t=)N6;Q%5ZeBgURIru{6YyBV>! zmXpUO$t!(l^P5BjhyGxFURN4+XA5^|;^CPQ>R%%>42-Xq0x6kp}qz857DE z#=tspJ%l@}$j#Ez*ypxS!p4Ne6|pWCM$|hZy<;~|eAD@o;0rdY;$i5H6nzpsWY^Tw zsN((d$H0+Ca1mV<=Mf@I)hfvQ0d$gc9j|a?{4_@IX+zFnVr7ASn-k5Fm##QFZn zTF`y7+_azSf72>Uk^P$ldrWPW`7`6~3*-8u&95?)Yc=TAKTj0et3ua>mW6WpJ6dpr zSJ&RZse@6(<9;f$sH~Ksj9T7Q-RBQgkxqogfLBK^IAw;G6dyKEwfjR(FcN&>^?+t5 zTX`rG`uXaOFAZQjfv?JW`s=1Yi3&uNSV1K-f9)X0Y_VTy7cLGwv1XPv^yF$soRh0% zt|S#&n`xp>veU@ClY>3bs+ zoFaC&%y>9_RS0?1n0D%6sdGL#FHyH>@1^5=C#J;09C*ZlHJxy&O0roxh~*$V*U@?4 zKJ)*5Ckk7|Gixw(eD*; z5xzR*EXe3#N2QV**ezF$<-V0mAs$G*Ge5DJJ%@RXYFptPPYOhGlAz&ctz~uMGbyPDaig3R6wsL!A(e)xM#+y zO=}=PfkEmeYZ&wO)Ju!sj0v5iLRpD!lrzKSX2UuezDq=YTeGTvFc-yl8z7T|YZtJ% zEe~O!lKgUbQgdrTn-c6?y9KO(toLbZ(-v%yjW6%(OnYgeWs`jfJUd;T7<1=ESFE~x z-?S)>#r&5x9r1nMI zFkBAtsb&ZBgQR2@z#Mh7%F?1B00>Y1L5Iq9~@6}$dJh`w5wqTVC z@7t4@=*6O35kV+E!y^4c5EBslx^907{PvJP6telng!E~hJNxI=-=3^s7u)&KdCW8I zzi6}@Pv_;+bf~6$L@yUM^;mI&vX>ECgEZp2{T|bfRu)>%6S6p$B^^4uoS__z-8PgmTRi;)NJ`+V&Y z$R9D8Jnc4O&a7}!ReN5duu3Eb^F~UQO5Q9aeH+YyQG}e5z!s(t)j$KfKIlNg`J~SH zNEeVUL>S9)b6P_LYbN=wmw zHEnIVxBo&%fezG^b$TU4M+h)klb4{DU{-*Vu07X3s%D_cSyx{RC(u1*#g+6I&o=to zZbKa2Fi#8ONb=bDmiJz>*xPa!aAt4fFF=uYns!+iF4A#NExY0u$umdHa*csGA9io+ zsa^G|=$h=MqX)AE+$aNtBL1zS`;{MPfxhS%+w_$}j01nB{l6t*{%{|q9bDV@*g$84 zR-$VNWCJ@Rh>>b7_i|A|H0qR=)s(I(VHMQCduIS`8`N- z(E?BHMtU@4E7RR6*G2(7Y*#S)l5L+D4fJurZf-ZLvb>wpi+m5=d*0Dao(z$$B95CJ zlO9QUqUS!=sbC<^w;BETPJOl0yhh0|_Q94qLe(qM&ST>$mp$+VaHH6jKEcFX*~E+; zqV^6>srcI373xQ5veP%u_JYMefKS!|bYtCQ?vh1vU_x&^Uj63V%v7@-`Q2krS^ac7 z7w8I|0{l5$Kixk|;J4|Wjz$b}EN<5~LWEId_+$7C9`O^n3DFv@j(u?-t~5M!kStX% z6$%Hq?cM6amfVClx#w4W-*)9VgJx`8*`o)4N=zexGVTJua85hQT3!*&x>YAa22jbf zsZ_Na|1y(2)k8q~d5DUbgMX#7C<=v&gd&fpjrRBYcEPzI7>6r;_{VV9qyf-5R0K=_ znr}JY#WTx!M`h}Ix`DXgnDl_x2a}y%shz7vb2Fyq%zU*}UuJ&>MpqtJpoS2OX)z}g zU&I@0)GjmPWhqhNHw!IUIGFz2cK5yZ*eko&f7Zv#&aUDwu-7K-+Yu4$j)Gg2y}9X; z(PmHQoWf5}KAWDK&E5O$JNOVPM8mf{qJ_q5m@qXDt!)RQt^h*H6*lm#TMIm%V%~0O zV^Xk`8wI$(G@BUr@8e(V*0>q2aFNL!cFoHZ#%@gBMF-iiMe!N8GScKV>d z?-_UK7csoFVr}nr2&T6s#iCnxWupLcCW{q}K=1UCkSjQw3F`9typdM_LQo(|;X?&g zZk$N>-w9r3P$F}fYJIym`~@{3a@`RCaKrzwe;5paV%d@l$pk2XB26gz&`fx)7=ND+ zBFPivT!iqbT{uD=fl(zn@~68Ln5c>)OToxHW)ARVFjz^FboIsoX~;0yeOrLzEIRzp(xux zwL}HhsOL|89QLc$xG1!@(i7Dwa?ajr@E#Q9P>j8i!;=csQ7U;&bzcEbk#5^%><{nZ zK1*>+g$$<+nIlo4xqt&_wZ3EVtI?Ja8h0+K0^oitE`t9)LU=Rro{S%yAAuuNt8n{O=+N{p3}Y z-#3KqK)d`g%IhYjO+NkC9oe!1#TYP<&F2R5+VQb^?X2eE;L;7!>jAg$oj)jpuH=*1 z*J(|5ERTG>eZ$g6B5PCaxee9IOVZJ;tE>AdJg$ zi(d_4zKg1K0MkqVqloTH-fwOxt33p^b5G%P^1X|@kYro4Vy9JGJ04@;RM^jJM}}xG z$aBc^%=$$Jt8Vt8^vI~m6foCh6p?bTwXZQJ3T+t)@NoZd+GbR^9*Ne^zv$jKqWslW z_2SVxThF3;6i#Y{F_uZ@Rw3xFKCHM*c@+qjZuw@=7+@xdI{ZDo0&#DEmmmEZ)aX-~`ZP<{ zYqI+= znt?JWMxij7qmwAjr|KT-u^4T`yT^bm)QYRHUKvQ#?|iXx4QoLdoT3WfuqnSu>ril$ zfe#O|u0kiFBUx&mShXpF*RNWF%jp%WxKqmZ9B~ZL z74}kfzqHcsFW1e6Y*oGcp@2n3pP6uV-?Hj-oQ!c@A1XnXq{mwxRg%5I3Tj@z3KeSg zK#4*R(8OE?b_f5hq;L+c;&^j^92mLb^rdd-XUyN2S0MYEzr)=)E$d(0 z)9JaJqg&~tAc2TXEowEW>Yp_H#BptmrVB>vUO?^if)y_vw*gkLw`O$mx6oxHUTyHpN_=k-=gKZ`W|5mfv5Bf^7_q; zDv?%|yhA!j!J}xZG>88fB8ci{x?hcp;&&&vzfq`k&9!(B>Ja}VZMQ^U)^PWh|NlmM;wPxBrCz<$mV2Ko+B%1z!MXV*JG5Y$MebnS z{KmaoEMjGVJeY9w37!pL9dc(C%Dv|A{P-wJFK*OG3EnOb$PX!8+-j=Um`L*oM1xsx zrjw_?W??oFVy|GMqRgT^Dap7*#|W20B*-{R_Q0$C5CNU#Jkr@@o!8&J|DVP3#Xt>Dq5xRC>9v|-!66hUF^^KEx@4LEKgvzRjRM@BnADC3OuAUS6>-J%F zkLQhc{sN;OsGd-?`$%944_zw(Z=+w7sclRQ%q zi>frzKYf~4d>LnhlDV!7iw!Eh_jNmHd5wDD8_O-mh~>;Z@<2?H@3@kASa zCbGev%kt!#uLsm049WXNDB0MoN1G!B^cUPHw77e4;)6Q?)l#wb-uf`0#XA!fLeSiL z7OU85Ir6_;%0jSVBG$X`u1BxkH_K0B%3hU}ylu4nkK#APBwZqRh5}j(^44L#cx=lN zA+hr(yRb_xM3(12$a=)g@`i*9q{{d#5$ z&xhIx>Y|(bdu9tP^Q~q%HIu~_QcED(hKzoJBk_a4bJ(cUbaHuG-+ch2?-gN4M4zM8Zb#GKh*dlSXbj4(@|*T>*+O zT_3N2B-h=b@+4^$=Dq>$dUCxh03$(Iloa}K^FzyfeON~PsuWNDoh_;5KHD=^WK`HM zi}Bd7v3r>1UL~NXsSvCe{&Swk)zqOwR=l0Cdv@WfOyZC0-z$jtVj=9QHH73kbsJi= zpgu`d)c>#^(N9(il|k!oLGwfc>5?_vC!ulQUMTYvA z>7+|H&Hc^MaJ0m`W1L%y?29$FvbVA%F1BS$NgVMWv;GJvkM<1~!fYf<&v(_jZNvG* zbmiV)B1&Lurz%ys@-G^0*&Cj%8GPdSsdhGK3s-@h_;hO?*OXkBECn1^f5D!AIka9| zSsy>ZrO-Gu67{kwJuFT(i&5^4AL`x<)7|CzX!Fx)g^^}M!gFK$KHkK&@1Eo68NKpp zkiW{q4vGSW6;&+oHQUtCBSuZDTI|jVN&8{+*oYkHft9}|&ul~>Lv^$BwSD`YmiH%9 z%#y9Vo4ev*mHpOoFt9?NNrA9aVLg6na8gB();pU1D8_RyA8%8Bp~iB_$O1r+%7$T2 zbYOuUnkXfAv`imx*^ z$y+Z}Lcj3`qtUyGj36E?;tvW<7Tb^he1;EmO&qfI5F3{IcI2GWHz|?*M5#Af^&sP@ z9Ti2habb16TofB*DOLAr^(r=7kxoIuj?@-5N{ z9@$gG)}3Iz=)3p0;U(bP;WDoVUJ_laUixUuaij>A(SqQU1?$>op1yQn^={o@ zLs%TnlOFW8ev19quc}<$nsGgPeDZ5S3@EdW$;hncnfZX$?$&hap1hx{)_H-4H>B8( zvQy5C%Wc`RR&(^xnS=i~&#)+$KN#k$@3{}IioQ#Bg)v7AFZ40334|}+pO&Q>k#5&K zpM03zsetv8gCixK=XA}BeiEy%89VL?QuHLQOUb&m z*cvxvK`JDZxF~3ih>d~W`}{GFd{~3X+T5{HClEc@=*ateAv?zgu|(L;gOSpSE&~xq{T8{|&Xh@ON;q$R ztC;hXBtvVIj?nM2Ons5hd`bK;PT_2P^~`cQgIcugI#S_ZVc}`Ku%*7EEa|fit z)LCVS%)Osz-fEoM3%HMDI3Gd@r}U`l>8hv49$vWrjX1RR<5`mj`X9`{k zvrs4KFkIFIRDQvOAYS?v9GoMWyMd*7B`9#Cg89A_s13^t_fYO`?XV3&*N3>3MBys; zZ7@9m*>cC%YaA(Frd!n+w+XBYHFE>AzWp>mq@l^u@&(iJ9PDTETDzC-<-}R9;~vi+ z>xhzh45hc>8yzg$6Hy)xfGQJ+XUMPiB#?jCADB4Wd0rUxCGWn@DbxvI=f+wtOL-n+ z2{_0HO02*)zHQi|wliMM(Fy*a2qOK&__Kw|Kososg&d2_6EHG1PZ$fZa9 zJ>HWrjf+v&&CnXjDKh&}DXc`*>4qIJ%Z(BkiT^v?2BfL9Pw{C|iDlN_l_xa)N0~vI zPZpIEg^a6_kQLkkhnHH5_eZr%Og9E?_cO3;Km-2zs&tIplevN`~2-ru0qU$ydyuWVu@+b+@OdTKR9dIpTvx!e#DHdZzVEosKgL4GF@Ge`(G%_(In9Ngd|| z7DT;xb}8mcou1m%1)9hj96PIUGi3}_uPI!LSem*Ua*^w7rE=bFIY{C#ys))=Q0wVs zK=v)3U3OZ*78|@OM`tHg-I1TQLac(%5fR#%49d`rrP*a9W(>T+9Bj3J>#kJiFCp60 zseZ*{VE02OmC?nL4^WD%@Y`Z<=&ppc=Tk-R0&ev!gt(db3g6dEGyTcqS$G?!lmG99 zA=jDqvN)c8z#RqKZd#1fNJZ$Lj&DIazFFH_wJXUx=Y`f!s33Q9FY+@o(-hGZZeV=E zjEy@PW)S*-^W$9cd9!Y%&w{=84U)OivE<}gdsoC|DlSB+XeMn(!Y%5<+V!^mNht@H2B&XS3 zM14}da?h|9ROf^AW-ncyDYqhkhu4GFP`HyrLuv_$53v{Wku%?Ll^U7lYH2xZQugZC z(1avL8lX1$r{diMMPw zPqM--5LWIxeyS<+q_k#|lT_f|&N}qV`_qD=Z1xn7&cD+8_e(6IV*N;1x}a){?_nUd za?G+FxZb-Aa6Ro80RCn%@Y?Zm#+wH092ERdE%`I^so=dTF!0UsqgDDIsONJ`>wP8_ zfAFzB!G=8W*zd=U;Fj}eUp0ODHu7M*v!BrSxfPsuPi}6+AKks>0K9SbEo&!$HD~!o z>%FTg10DbQym}xc$Lz~?e-reiJ+r4G`fE value, converter @@ -963,9 +993,10 @@ def _validate_linestyle(ls): 'lines.solid_joinstyle': ['round', validate_joinstyle], 'lines.dash_capstyle': ['butt', validate_capstyle], 'lines.solid_capstyle': ['projecting', validate_capstyle], - 'lines.dashed_pattern': [[3.7, 1.6], validate_nseq_float()], - 'lines.dashdot_pattern': [[6.4, 1.6, 1, 1.6], validate_nseq_float()], - 'lines.dotted_pattern': [[1, 1.65], validate_nseq_float()], + 'lines.dashed_pattern': [[3.7, 1.6], validate_nseq_float(allow_none=True)], + 'lines.dashdot_pattern': [[6.4, 1.6, 1, 1.6], + validate_nseq_float(allow_none=True)], + 'lines.dotted_pattern': [[1, 1.65], validate_nseq_float(allow_none=True)], 'lines.scale_dashes': [True, validate_bool], # marker props @@ -1234,6 +1265,7 @@ def _validate_linestyle(ls): # fontsize of the xtick labels 'xtick.labelsize': ['medium', validate_fontsize], 'xtick.direction': ['out', six.text_type], # direction of xticks + 'xtick.alignment': ["center", _validate_alignment], 'ytick.left': [True, validate_bool], # draw ticks on the left side 'ytick.right': [False, validate_bool], # draw ticks on the right side @@ -1253,6 +1285,8 @@ def _validate_linestyle(ls): # fontsize of the ytick labels 'ytick.labelsize': ['medium', validate_fontsize], 'ytick.direction': ['out', six.text_type], # direction of yticks + 'ytick.alignment': ["center_baseline", _validate_alignment], + 'grid.color': ['#b0b0b0', validate_color], # grid color 'grid.linestyle': ['-', _validate_linestyle], # solid diff --git a/lib/matplotlib/sphinxext/tests/test_tinypages.py b/lib/matplotlib/sphinxext/tests/test_tinypages.py index ca825f73b008..5141a4cdd37d 100644 --- a/lib/matplotlib/sphinxext/tests/test_tinypages.py +++ b/lib/matplotlib/sphinxext/tests/test_tinypages.py @@ -1,29 +1,32 @@ """ Tests for tinypages build using sphinx extensions """ +import filecmp +from os.path import join as pjoin, dirname, isdir import shutil -import tempfile - -from os.path import (join as pjoin, dirname, isdir) - from subprocess import call, Popen, PIPE +import sys +import tempfile import pytest +from matplotlib import cbook + HERE = dirname(__file__) TINY_PAGES = pjoin(HERE, 'tinypages') def setup_module(): - """Check we have the sphinx-build command""" - try: - ret = call(['sphinx-build', '--help'], stdout=PIPE, stderr=PIPE) - except OSError: - pytest.skip('Need sphinx-build on path for these tests') + """Check we have a recent enough version of sphinx installed. + """ + ret = call([sys.executable, '-msphinx', '--help'], + stdout=PIPE, stderr=PIPE) if ret != 0: - raise RuntimeError('sphinx-build does not return 0') + raise RuntimeError( + "'{} -msphinx' does not return 0".format(sys.executable)) +@cbook.deprecated("2.1", alternative="filecmp.cmp") def file_same(file1, file2): with open(file1, 'rb') as fobj: contents1 = fobj.read() @@ -42,15 +45,16 @@ def setup_class(cls): cls.html_dir = pjoin(cls.page_build, 'html') cls.doctree_dir = pjoin(cls.page_build, 'doctrees') # Build the pages with warnings turned into errors - cmd = [str('sphinx-build'), '-W', '-b', 'html', + cmd = [sys.executable, '-msphinx', '-W', '-b', 'html', '-d', cls.doctree_dir, TINY_PAGES, cls.html_dir] proc = Popen(cmd, stdout=PIPE, stderr=PIPE) out, err = proc.communicate() if proc.returncode != 0: - raise RuntimeError('sphinx-build failed with stdout:\n' - '{0}\nstderr:\n{1}\n'.format(out, err)) + raise RuntimeError( + "'{} -msphinx' failed with stdout:\n{}\nstderr:\n{}\n" + .format(sys.executable, out, err)) except Exception as e: shutil.rmtree(cls.page_build) raise e @@ -67,22 +71,22 @@ def plot_file(num): range_10, range_6, range_4 = [plot_file(i) for i in range(1, 4)] # Plot 5 is range(6) plot - assert file_same(range_6, plot_file(5)) + assert filecmp.cmp(range_6, plot_file(5)) # Plot 7 is range(4) plot - assert file_same(range_4, plot_file(7)) + assert filecmp.cmp(range_4, plot_file(7)) # Plot 11 is range(10) plot - assert file_same(range_10, plot_file(11)) + assert filecmp.cmp(range_10, plot_file(11)) # Plot 12 uses the old range(10) figure and the new range(6) figure - assert file_same(range_10, plot_file('12_00')) - assert file_same(range_6, plot_file('12_01')) + assert filecmp.cmp(range_10, plot_file('12_00')) + assert filecmp.cmp(range_6, plot_file('12_01')) # Plot 13 shows close-figs in action - assert file_same(range_4, plot_file(13)) + assert filecmp.cmp(range_4, plot_file(13)) # Plot 14 has included source with open(pjoin(self.html_dir, 'some_plots.html'), 'rb') as fobj: html_contents = fobj.read() assert b'# Only a comment' in html_contents # check plot defined in external file. - assert file_same(range_4, pjoin(self.html_dir, 'range4.png')) - assert file_same(range_6, pjoin(self.html_dir, 'range6.png')) + assert filecmp.cmp(range_4, pjoin(self.html_dir, 'range4.png')) + assert filecmp.cmp(range_6, pjoin(self.html_dir, 'range6.png')) # check if figure caption made it into html file assert b'This is the caption for plot 15.' in html_contents diff --git a/lib/matplotlib/testing/compare.py b/lib/matplotlib/testing/compare.py index ab2f26fc0081..0483e875eb17 100644 --- a/lib/matplotlib/testing/compare.py +++ b/lib/matplotlib/testing/compare.py @@ -7,9 +7,15 @@ import six +import atexit +import functools import hashlib +import itertools import os +import re import shutil +import sys +from tempfile import TemporaryFile import numpy as np @@ -19,7 +25,6 @@ from matplotlib import _png from matplotlib import _get_cachedir from matplotlib import cbook -from distutils import version __all__ = ['compare_float', 'compare_images', 'comparable_formats'] @@ -128,6 +133,110 @@ def convert(old, new): return convert +# Modified from https://bugs.python.org/issue25567. +_find_unsafe_bytes = re.compile(br'[^a-zA-Z0-9_@%+=:,./-]').search + + +def _shlex_quote_bytes(b): + return (b if _find_unsafe_bytes(b) is None + else b"'" + b.replace(b"'", b"'\"'\"'") + b"'") + + +class _SVGConverter(object): + def __init__(self): + self._proc = None + # We cannot rely on the GC to trigger `__del__` at exit because + # other modules (e.g. `subprocess`) may already have their globals + # set to `None`, which make `proc.communicate` or `proc.terminate` + # fail. By relying on `atexit` we ensure the destructor runs before + # `None`-setting occurs. + atexit.register(self.__del__) + + def _read_to_prompt(self): + """Did Inkscape reach the prompt without crashing? + """ + stream = iter(functools.partial(self._proc.stdout.read, 1), b"") + prompt = (b"\n", b">") + n = len(prompt) + its = itertools.tee(stream, n) + for i, it in enumerate(its): + next(itertools.islice(it, i, i), None) # Advance `it` by `i`. + while True: + window = tuple(map(next, its)) + if len(window) != n: + # Ran out of data -- one of the `next(it)` raised + # StopIteration, so the tuple is shorter. + return False + if self._proc.poll() is not None: + # Inkscape exited. + return False + if window == prompt: + # Successfully read until prompt. + return True + + def __call__(self, orig, dest): + if (not self._proc # First run. + or self._proc.poll() is not None): # Inkscape terminated. + env = os.environ.copy() + # If one passes e.g. a png file to Inkscape, it will try to + # query the user for conversion options via a GUI (even with + # `--without-gui`). Unsetting `DISPLAY` prevents this (and causes + # GTK to crash and Inkscape to terminate, but that'll just be + # reported as a regular exception below). + env.pop("DISPLAY", None) # May already be unset. + # Do not load any user options. + # `os.environ` needs native strings on Py2+Windows. + env[str("INKSCAPE_PROFILE_DIR")] = os.devnull + # Old versions of Inkscape (0.48.3.1, used on Travis as of now) + # seem to sometimes deadlock when stderr is redirected to a pipe, + # so we redirect it to a temporary file instead. This is not + # necessary anymore as of Inkscape 0.92.1. + self._stderr = TemporaryFile() + self._proc = subprocess.Popen( + [str("inkscape"), "--without-gui", "--shell"], + stdin=subprocess.PIPE, stdout=subprocess.PIPE, + stderr=self._stderr, env=env) + if not self._read_to_prompt(): + raise OSError("Failed to start Inkscape") + + try: + fsencode = os.fsencode + except AttributeError: # Py2. + def fsencode(s): + return s.encode(sys.getfilesystemencoding()) + + # Inkscape uses glib's `g_shell_parse_argv`, which has a consistent + # behavior across platforms, so we can just use `shlex.quote`. + orig_b, dest_b = map(_shlex_quote_bytes, map(fsencode, [orig, dest])) + if b"\n" in orig_b or b"\n" in dest_b: + # Who knows whether the current folder name has a newline, or if + # our encoding is even ASCII compatible... Just fall back on the + # slow solution (Inkscape uses `fgets` so it will always stop at a + # newline). + return make_external_conversion_command(lambda old, new: [ + str('inkscape'), '-z', old, '--export-png', new])(orig, dest) + self._proc.stdin.write(orig_b + b" --export-png=" + dest_b + b"\n") + self._proc.stdin.flush() + if not self._read_to_prompt(): + # Inkscape's output is not localized but gtk's is, so the + # output stream probably has a mixed encoding. Using + # `getfilesystemencoding` should at least get the filenames + # right... + self._stderr.seek(0) + raise ImageComparisonFailure( + self._stderr.read().decode( + sys.getfilesystemencoding(), "replace")) + + def __del__(self): + if self._proc: + if self._proc.poll() is None: # Not exited yet. + self._proc.communicate(b"quit\n") + self._proc.wait() + self._proc.stdin.close() + self._proc.stdout.close() + self._stderr.close() + + def _update_converter(): gs, gs_v = matplotlib.checkdep_ghostscript() if gs_v is not None: @@ -138,9 +247,7 @@ def cmd(old, new): converter['eps'] = make_external_conversion_command(cmd) if matplotlib.checkdep_inkscape() is not None: - def cmd(old, new): - return [str('inkscape'), '-z', old, '--export-png', new] - converter['svg'] = make_external_conversion_command(cmd) + converter['svg'] = _SVGConverter() #: A dictionary that maps filename extensions to functions which @@ -363,9 +470,8 @@ def save_diff_image(expected, actual, output): actual, actualImage, expected, expectedImage) expectedImage = np.array(expectedImage).astype(float) actualImage = np.array(actualImage).astype(float) - assert expectedImage.ndim == actualImage.ndim assert expectedImage.shape == actualImage.shape - absDiffImage = abs(expectedImage - actualImage) + absDiffImage = np.abs(expectedImage - actualImage) # expand differences in luminance domain absDiffImage *= 255 * 10 diff --git a/lib/matplotlib/testing/decorators.py b/lib/matplotlib/testing/decorators.py index a026eb8c02ea..0c07a62c13de 100644 --- a/lib/matplotlib/testing/decorators.py +++ b/lib/matplotlib/testing/decorators.py @@ -11,9 +11,9 @@ import warnings import unittest -# Note - don't import nose up here - import it only as needed in functions. This -# allows other functions here to be used by pytest-based testing suites without -# requiring nose to be installed. +# Note - don't import nose up here - import it only as needed in functions. +# This allows other functions here to be used by pytest-based testing suites +# without requiring nose to be installed. import matplotlib as mpl @@ -150,7 +150,7 @@ def wrapped_callable(*args, **kwargs): return make_cleanup else: result = make_cleanup(style) - style = 'classic' + style = '_classic_test' return result @@ -281,12 +281,7 @@ def copy_baseline(self, baseline, extension): reason = ("Do not have baseline image {0} because this " "file does not exist: {1}".format(expected_fname, orig_expected_fname)) - if is_called_from_pytest(): - import pytest - pytest.xfail(reason) - else: - from ._nose import knownfail - knownfail(reason) + raise ImageComparisonFailure(reason) return expected_fname def compare(self, idx, baseline, extension): @@ -367,43 +362,42 @@ def runner_wrapper(): def image_comparison(baseline_images=None, extensions=None, tol=0, freetype_version=None, remove_text=False, - savefig_kwarg=None, style='classic'): + savefig_kwarg=None, style='_classic_test'): """ Compare images generated by the test with those specified in *baseline_images*, which must correspond else an ImageComparisonFailure exception will be raised. - Keyword arguments: + Arguments + --------- + baseline_images : list + A list of strings specifying the names of the images generated by + calls to :meth:`matplotlib.figure.savefig`. - *baseline_images*: list - A list of strings specifying the names of the images generated - by calls to :meth:`matplotlib.figure.savefig`. - - *extensions*: [ None | list ] - - If *None*, default to all supported extensions. + extensions : [ None | list ] + If None, defaults to all supported extensions. Otherwise, a list of extensions to test. For example ['png','pdf']. - *tol*: (default 0) + tol : float, optional, default: 0 The RMS threshold above which the test is considered failed. - *freetype_version*: str or tuple - The expected freetype version or range of versions for this - test to pass. + freetype_version : str or tuple + The expected freetype version or range of versions for this test to + pass. - *remove_text*: bool - Remove the title and tick text from the figure before - comparison. This does not remove other, more deliberate, - text, such as legends and annotations. + remove_text : bool + Remove the title and tick text from the figure before comparison. + This does not remove other, more deliberate, text, such as legends and + annotations. - *savefig_kwarg*: dict + savefig_kwarg : dict Optional arguments that are passed to the savefig method. - *style*: string - Optional name for the base style to apply to the image - test. The test itself can also apply additional styles - if desired. Defaults to the 'classic' style. + style : string + Optional name for the base style to apply to the image test. The test + itself can also apply additional styles if desired. Defaults to the + '_classic_test' style. """ if baseline_images is None: diff --git a/lib/matplotlib/tests/baseline_images/test_axes/arc_angles.png b/lib/matplotlib/tests/baseline_images/test_axes/arc_angles.png new file mode 100644 index 0000000000000000000000000000000000000000..82a9840913f380870dd1177533226892f7ee46c6 GIT binary patch literal 25491 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 I{TS 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ɖBpg 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_image/imshow_masked_interpolation.pdf b/lib/matplotlib/tests/baseline_images/test_image/imshow_masked_interpolation.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ea5a6c877fdaa6310383e6af8a69b7158df1196f GIT binary patch literal 27055 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_image/imshow_masked_interpolation.png b/lib/matplotlib/tests/baseline_images/test_image/imshow_masked_interpolation.png new file mode 100644 index 0000000000000000000000000000000000000000..07fba85d3c2de34255b5dbbf1868f153a672cc8b GIT binary patch literal 19273 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 Y1r<@zopr0Nk!bKmY&$ literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_image/imshow_masked_interpolation.svg b/lib/matplotlib/tests/baseline_images/test_image/imshow_masked_interpolation.svg new file mode 100644 index 000000000000..af53f58c3ab5 --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_image/imshow_masked_interpolation.svg @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_image/mask_image_over_under.png b/lib/matplotlib/tests/baseline_images/test_image/mask_image_over_under.png index 6433cd355e856e6088b81963ba75a57f209482a3..447494239a0f304a0d6cb70db391531f451e799b 100644 GIT binary patch delta 24625 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_tightlayout/tight_layout9.png b/lib/matplotlib/tests/baseline_images/test_tightlayout/tight_layout9.png new file mode 100644 index 0000000000000000000000000000000000000000..2d63e6987a38e666be9daa7023cfe0ada2dee395 GIT binary patch literal 18802 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

W8+v-b3x9vv4RJe^soYo!K4QJXlnd)jyZwB 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 41d604808b5d..2219bda7f61b 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -1002,6 +1002,32 @@ def test_canonical(): ax.plot([1, 2, 3]) +@image_comparison(baseline_images=['arc_angles'], remove_text=True, + style='default', extensions=['png']) +def test_arc_angles(): + from matplotlib import patches + # Ellipse parameters + w = 2 + h = 1 + centre = (0.2, 0.5) + + fig, axs = plt.subplots(3, 3) + for i, ax in enumerate(axs.flat): + theta2 = i * 360 / 9 + theta1 = theta2 - 45 + ax.add_patch(patches.Ellipse(centre, w, h, alpha=0.3)) + ax.add_patch(patches.Arc(centre, w, h, theta1=theta1, theta2=theta2)) + # Straight lines intersecting start and end of arc + ax.plot([2 * np.cos(np.deg2rad(theta1)) + centre[0], + centre[0], + 2 * np.cos(np.deg2rad(theta2)) + centre[0]], + [2 * np.sin(np.deg2rad(theta1)) + centre[1], + centre[1], + 2 * np.sin(np.deg2rad(theta2)) + centre[1]]) + ax.set_xlim(-2, 2) + ax.set_ylim(-2, 2) + + @image_comparison(baseline_images=['arc_ellipse'], remove_text=True) def test_arc_ellipse(): @@ -1010,15 +1036,14 @@ def test_arc_ellipse(): width, height = 1e-1, 3e-1 angle = -30 - theta = np.arange(0.0, 360.0, 1.0)*np.pi/180.0 - x = width/2. * np.cos(theta) - y = height/2. * np.sin(theta) + theta = np.arange(0.0, 360.0, 1.0) * np.pi / 180.0 + x = width / 2. * np.cos(theta) + y = height / 2. * np.sin(theta) - rtheta = angle*np.pi/180. + rtheta = angle * np.pi / 180. R = np.array([ - [np.cos(rtheta), -np.sin(rtheta)], - [np.sin(rtheta), np.cos(rtheta)], - ]) + [np.cos(rtheta), -np.sin(rtheta)], + [np.sin(rtheta), np.cos(rtheta)]]) x, y = np.dot(R, np.array([x, y])) x += xcenter @@ -1222,6 +1247,17 @@ def test_bar_tick_label_multiple(): align='center') +@image_comparison( + baseline_images=['bar_tick_label_multiple_old_label_alignment'], + extensions=['png']) +def test_bar_tick_label_multiple_old_alignment(): + # Test that the algnment for class is backward compatible + matplotlib.rcParams["ytick.alignment"] = "center" + ax = plt.gca() + ax.bar([1, 2.5], [1, 2], width=[0.2, 0.5], tick_label=['a', 'b'], + align='center') + + @image_comparison(baseline_images=['barh_tick_label'], extensions=['png']) def test_barh_tick_label(): @@ -2534,6 +2570,17 @@ def test_errorbar_limits(): ax.set_title('Errorbar upper and lower limits') +def test_errobar_nonefmt(): + # Check that passing 'none' as a format still plots errorbars + x = np.arange(5) + y = np.arange(5) + + plotline, _, barlines = plt.errorbar(x, y, xerr=1, yerr=1, fmt='none') + assert plotline is None + for errbar in barlines: + assert np.all(errbar.get_color() == mcolors.to_rgba('C0')) + + @image_comparison(baseline_images=['hist_stacked_stepfilled', 'hist_stacked_stepfilled']) def test_hist_stacked_stepfilled(): @@ -4242,6 +4289,22 @@ def test_pie_frame_grid(): plt.axis('equal') +@image_comparison(baseline_images=['pie_rotatelabels_true'], + extensions=['png']) +def test_pie_rotatelabels_true(): + # The slices will be ordered and plotted counter-clockwise. + labels = 'Hogwarts', 'Frogs', 'Dogs', 'Logs' + sizes = [15, 30, 45, 10] + colors = ['yellowgreen', 'gold', 'lightskyblue', 'lightcoral'] + explode = (0, 0.1, 0, 0) # only "explode" the 2nd slice (i.e. 'Hogs') + + plt.pie(sizes, explode=explode, labels=labels, colors=colors, + autopct='%1.1f%%', shadow=True, startangle=90, + rotatelabels=True) + # Set aspect ratio to be equal so that pie is drawn as a circle. + plt.axis('equal') + + @image_comparison(baseline_images=['set_get_ticklabels'], extensions=['png']) def test_set_get_ticklabels(): # test issue 2246 @@ -4972,3 +5035,15 @@ def test_bar_single_height(): ax.bar(range(4), 1) # Check that a horizontal chart with one width works ax.bar(0, 1, bottom=range(4), width=1, orientation='horizontal') + + +def test_invalid_axis_limits(): + plt.plot([0, 1], [0, 1]) + with pytest.raises(ValueError): + plt.xlim(np.nan) + with pytest.raises(ValueError): + plt.xlim(np.inf) + with pytest.raises(ValueError): + plt.ylim(np.nan) + with pytest.raises(ValueError): + plt.ylim(np.inf) diff --git a/lib/matplotlib/tests/test_contour.py b/lib/matplotlib/tests/test_contour.py index e455bd4c07b8..cc90aa2510b0 100644 --- a/lib/matplotlib/tests/test_contour.py +++ b/lib/matplotlib/tests/test_contour.py @@ -46,10 +46,9 @@ def test_contour_shape_mismatch_1(): fig = plt.figure() ax = fig.add_subplot(111) - try: + with pytest.raises(TypeError) as excinfo: ax.contour(x, y, z) - except TypeError as exc: - assert exc.args[0] == 'Length of x must be number of columns in z.' + excinfo.match(r'Length of x must be number of columns in z.') def test_contour_shape_mismatch_2(): @@ -61,10 +60,9 @@ def test_contour_shape_mismatch_2(): fig = plt.figure() ax = fig.add_subplot(111) - try: + with pytest.raises(TypeError) as excinfo: ax.contour(x, y, z) - except TypeError as exc: - assert exc.args[0] == 'Length of y must be number of rows in z.' + excinfo.match(r'Length of y must be number of rows in z.') def test_contour_shape_mismatch_3(): @@ -77,15 +75,13 @@ def test_contour_shape_mismatch_3(): fig = plt.figure() ax = fig.add_subplot(111) - try: + with pytest.raises(TypeError) as excinfo: ax.contour(xg, y, z) - except TypeError as exc: - assert exc.args[0] == 'Number of dimensions of x and y should match.' + excinfo.match(r'Number of dimensions of x and y should match.') - try: + with pytest.raises(TypeError) as excinfo: ax.contour(x, yg, z) - except TypeError as exc: - assert exc.args[0] == 'Number of dimensions of x and y should match.' + excinfo.match(r'Number of dimensions of x and y should match.') def test_contour_shape_mismatch_4(): @@ -97,21 +93,15 @@ def test_contour_shape_mismatch_4(): fig = plt.figure() ax = fig.add_subplot(111) - try: + with pytest.raises(TypeError) as excinfo: ax.contour(b, g, z) - except TypeError as exc: - assert re.match( - r'Shape of x does not match that of z: ' + - r'found \(9L?, 9L?\) instead of \(9L?, 10L?\)\.', - exc.args[0]) is not None, exc.args[0] + excinfo.match(r'Shape of x does not match that of z: found \(9L?, 9L?\) ' + + r'instead of \(9L?, 10L?\)') - try: + with pytest.raises(TypeError) as excinfo: ax.contour(g, b, z) - except TypeError as exc: - assert re.match( - r'Shape of y does not match that of z: ' + - r'found \(9L?, 9L?\) instead of \(9L?, 10L?\)\.', - exc.args[0]) is not None, exc.args[0] + excinfo.match(r'Shape of y does not match that of z: found \(9L?, 9L?\) ' + + r'instead of \(9L?, 10L?\)') def test_contour_shape_invalid_1(): @@ -123,10 +113,9 @@ def test_contour_shape_invalid_1(): fig = plt.figure() ax = fig.add_subplot(111) - try: + with pytest.raises(TypeError) as excinfo: ax.contour(x, y, z) - except TypeError as exc: - assert exc.args[0] == 'Inputs x and y must be 1D or 2D.' + excinfo.match(r'Inputs x and y must be 1D or 2D.') def test_contour_shape_invalid_2(): @@ -138,10 +127,9 @@ def test_contour_shape_invalid_2(): fig = plt.figure() ax = fig.add_subplot(111) - try: + with pytest.raises(TypeError) as excinfo: ax.contour(x, y, z) - except TypeError as exc: - assert exc.args[0] == 'Input z must be a 2D array.' + excinfo.match(r'Input z must be a 2D array.') @image_comparison(baseline_images=['contour_manual_labels']) @@ -309,3 +297,46 @@ def test_contourf_symmetric_locator(): locator = plt.MaxNLocator(nbins=4, symmetric=True) cs = plt.contourf(z, locator=locator) assert_array_almost_equal(cs.levels, np.linspace(-12, 12, 5)) + + +def test_contour_1x1_array(): + # github issue 8197 + with pytest.raises(TypeError) as excinfo: + plt.contour([[0]]) + excinfo.match(r'Input z must be at least a 2x2 array.') + + with pytest.raises(TypeError) as excinfo: + plt.contour([0], [0], [[0]]) + excinfo.match(r'Input z must be at least a 2x2 array.') + + +def test_internal_cpp_api(): + # Following github issue 8197. + import matplotlib._contour as _contour + + with pytest.raises(TypeError) as excinfo: + qcg = _contour.QuadContourGenerator() + excinfo.match(r'function takes exactly 6 arguments \(0 given\)') + + with pytest.raises(ValueError) as excinfo: + qcg = _contour.QuadContourGenerator(1, 2, 3, 4, 5, 6) + excinfo.match(r'Expected 2-dimensional array, got 0') + + with pytest.raises(ValueError) as excinfo: + qcg = _contour.QuadContourGenerator([[0]], [[0]], [[]], None, True, 0) + excinfo.match(r'x, y and z must all be 2D arrays with the same dimensions') + + with pytest.raises(ValueError) as excinfo: + qcg = _contour.QuadContourGenerator([[0]], [[0]], [[0]], None, True, 0) + excinfo.match(r'x, y and z must all be at least 2x2 arrays') + + arr = [[0, 1], [2, 3]] + with pytest.raises(ValueError) as excinfo: + qcg = _contour.QuadContourGenerator(arr, arr, arr, [[0]], True, 0) + excinfo.match(r'If mask is set it must be a 2D array with the same ' + + r'dimensions as x.') + + qcg = _contour.QuadContourGenerator(arr, arr, arr, None, True, 0) + with pytest.raises(ValueError) as excinfo: + qcg.create_filled_contour(1, 0) + excinfo.match(r'filled contour levels must be increasing') diff --git a/lib/matplotlib/tests/test_cycles.py b/lib/matplotlib/tests/test_cycles.py index 8709508827b4..eadaf2508352 100644 --- a/lib/matplotlib/tests/test_cycles.py +++ b/lib/matplotlib/tests/test_cycles.py @@ -161,7 +161,7 @@ def test_valid_input_forms(): ax.set_prop_cycle('color', np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]])) - ax.set_prop_cycle('dashes', [[], [13, 2], [8, 3, 1, 3]]) + ax.set_prop_cycle('dashes', [[], [13, 2], [8, 3, 1, 3], [None, None]]) ax.set_prop_cycle(lw=[1, 2], color=['k', 'w'], ls=['-', '--']) ax.set_prop_cycle(lw=np.array([1, 2]), color=np.array(['k', 'w']), diff --git a/lib/matplotlib/tests/test_font_manager.py b/lib/matplotlib/tests/test_font_manager.py index 0ce4a5ee077a..5e7a63790667 100644 --- a/lib/matplotlib/tests/test_font_manager.py +++ b/lib/matplotlib/tests/test_font_manager.py @@ -4,7 +4,6 @@ import six import os -import sys import tempfile import warnings @@ -15,6 +14,14 @@ get_fontconfig_fonts, is_opentype_cff_font, fontManager as fm) from matplotlib import rc_context +if six.PY2: + from distutils.spawn import find_executable + has_fclist = find_executable('fc-list') is not None +else: + # py >= 3.3 + from shutil import which + has_fclist = which('fc-list') is not None + def test_font_priority(): with rc_context(rc={ @@ -65,6 +72,6 @@ def test_otf(): assert res == is_opentype_cff_font(f) -@pytest.mark.skipif(sys.platform == 'win32', reason='no fontconfig on Windows') +@pytest.mark.skipif(not has_fclist, reason='no fontconfig installed') def test_get_fontconfig_fonts(): assert len(get_fontconfig_fonts()) > 1 diff --git a/lib/matplotlib/tests/test_image.py b/lib/matplotlib/tests/test_image.py index bb963b1e0247..f6ead2c91db2 100644 --- a/lib/matplotlib/tests/test_image.py +++ b/lib/matplotlib/tests/test_image.py @@ -22,6 +22,7 @@ from copy import copy from numpy import ma +import matplotlib.image as mimage import matplotlib.colors as colors @@ -53,6 +54,7 @@ def test_image_interps(): ax3.imshow(X, interpolation='bicubic') ax3.set_ylabel('bicubic') + @image_comparison(baseline_images=['interp_nearest_vs_none'], extensions=['pdf', 'svg'], remove_text=True) def test_interp_nearest_vs_none(): @@ -726,6 +728,41 @@ def test_imshow_endianess(): ax2.imshow(Z.astype('>f8'), **kwargs) +@image_comparison(baseline_images=['imshow_masked_interpolation'], + remove_text=True, style='default') +def test_imshow_masked_interpolation(): + + cm = copy(plt.get_cmap('viridis')) + cm.set_over('r') + cm.set_under('b') + cm.set_bad('k') + + N = 20 + n = colors.Normalize(vmin=0, vmax=N*N-1) + + # data = np.random.random((N, N))*N*N + data = np.arange(N*N, dtype='float').reshape(N, N) + + data[5, 5] = -1 + + data[15, 5] = 1e5 + + # data[3, 3] = np.nan + + data[15, 15] = np.inf + + mask = np.zeros_like(data).astype('bool') + mask[5, 15] = True + + data = np.ma.masked_array(data, mask) + + fig, ax_grid = plt.subplots(3, 6) + for interp, ax in zip(sorted(mimage._interpd_), ax_grid.ravel()): + ax.set_title(interp) + ax.imshow(data, norm=n, cmap=cm, interpolation=interp) + ax.axis('off') + + def test_imshow_no_warn_invalid(): with warnings.catch_warnings(record=True) as warns: warnings.simplefilter("always") diff --git a/lib/matplotlib/tests/test_rcparams.py b/lib/matplotlib/tests/test_rcparams.py index 4e689f6b9c47..e84a90ee34cf 100644 --- a/lib/matplotlib/tests/test_rcparams.py +++ b/lib/matplotlib/tests/test_rcparams.py @@ -333,29 +333,45 @@ def generate_validator_testcases(valid): ), 'fail': (('aardvark', ValueError), ) - }, - {'validator': _validate_linestyle, # NB: case-insensitive - 'success': (('-', '-'), ('solid', 'solid'), - ('--', '--'), ('dashed', 'dashed'), - ('-.', '-.'), ('dashdot', 'dashdot'), - (':', ':'), ('dotted', 'dotted'), - ('', ''), (' ', ' '), - ('None', 'none'), ('none', 'none'), - ('DoTtEd', 'dotted'), - (['1.23', '4.56'], (None, [1.23, 4.56])), - ([1.23, 456], (None, [1.23, 456.0])), - ([1, 2, 3, 4], (None, [1.0, 2.0, 3.0, 4.0])), - ), - 'fail': (('aardvark', ValueError), # not a valid string - ((None, [1, 2]), ValueError), # (offset, dashes) is not OK - ((0, [1, 2]), ValueError), # idem - ((-1, [1, 2]), ValueError), # idem - ([1, 2, 3], ValueError), # not a sequence of even length - (1.23, ValueError) # not a sequence - ) } ) + # The behavior of _validate_linestyle depends on the version of Python. + # ASCII-compliant bytes arguments should pass on Python 2 because of the + # automatic conversion between bytes and strings. Python 3 does not + # perform such a conversion, so the same cases should raise an exception. + # + # Common cases: + ls_test = {'validator': _validate_linestyle, + 'success': (('-', '-'), ('solid', 'solid'), + ('--', '--'), ('dashed', 'dashed'), + ('-.', '-.'), ('dashdot', 'dashdot'), + (':', ':'), ('dotted', 'dotted'), + ('', ''), (' ', ' '), + ('None', 'none'), ('none', 'none'), + ('DoTtEd', 'dotted'), # case-insensitive + (['1.23', '4.56'], (None, [1.23, 4.56])), + ([1.23, 456], (None, [1.23, 456.0])), + ([1, 2, 3, 4], (None, [1.0, 2.0, 3.0, 4.0])), + ), + 'fail': (('aardvark', ValueError), # not a valid string + ('dotted'.encode('utf-16'), ValueError), # even on PY2 + ((None, [1, 2]), ValueError), # (offset, dashes) != OK + ((0, [1, 2]), ValueError), # idem + ((-1, [1, 2]), ValueError), # idem + ([1, 2, 3], ValueError), # sequence with odd length + (1.23, ValueError), # not a sequence + ) + } + # Add some cases of bytes arguments that Python 2 can convert silently: + ls_bytes_args = (b'dotted', 'dotted'.encode('ascii')) + if six.PY3: + ls_test['fail'] += tuple((arg, ValueError) for arg in ls_bytes_args) + else: + ls_test['success'] += tuple((arg, 'dotted') for arg in ls_bytes_args) + # Update the validation test sequence. + validation_tests += (ls_test,) + for validator_dict in validation_tests: validator = validator_dict['validator'] if valid: diff --git a/lib/matplotlib/tests/test_tightlayout.py b/lib/matplotlib/tests/test_tightlayout.py index d0a9cf5980ba..76d9c1424212 100644 --- a/lib/matplotlib/tests/test_tightlayout.py +++ b/lib/matplotlib/tests/test_tightlayout.py @@ -148,6 +148,7 @@ def test_tight_layout7(): ax.set_title('Right Title', loc='right', fontsize=fontsize) plt.tight_layout() + @image_comparison(baseline_images=['tight_layout8']) def test_tight_layout8(): 'Test automatic use of tight_layout' @@ -157,6 +158,15 @@ def test_tight_layout8(): example_plot(ax, fontsize=24) +@image_comparison(baseline_images=['tight_layout9']) +def test_tight_layout9(): + # Test tight_layout for non-visible suplots + # GH 8244 + f, axarr = plt.subplots(2, 2) + axarr[1][1].set_visible(False) + plt.tight_layout() + + # The following test is misleading when the text is removed. @image_comparison(baseline_images=['outward_ticks'], remove_text=False) def test_outward_ticks(): diff --git a/lib/matplotlib/tests/test_triangulation.py b/lib/matplotlib/tests/test_triangulation.py index 831a01c97efc..18969afacf39 100644 --- a/lib/matplotlib/tests/test_triangulation.py +++ b/lib/matplotlib/tests/test_triangulation.py @@ -1048,3 +1048,78 @@ def test_tricontourf_decreasing_levels(): plt.figure() with pytest.raises(ValueError): plt.tricontourf(x, y, z, [1.0, 0.0]) + + +def test_internal_cpp_api(): + # Following github issue 8197. + import matplotlib._tri as _tri + + # C++ Triangulation. + with pytest.raises(TypeError) as excinfo: + triang = _tri.Triangulation() + excinfo.match(r'function takes exactly 7 arguments \(0 given\)') + + with pytest.raises(ValueError) as excinfo: + triang = _tri.Triangulation([], [1], [[]], None, None, None, False) + excinfo.match(r'x and y must be 1D arrays of the same length') + + x = [0, 1, 1] + y = [0, 0, 1] + with pytest.raises(ValueError) as excinfo: + triang = _tri.Triangulation(x, y, [[0, 1]], None, None, None, False) + excinfo.match(r'triangles must be a 2D array of shape \(\?,3\)') + + tris = [[0, 1, 2]] + with pytest.raises(ValueError) as excinfo: + triang = _tri.Triangulation(x, y, tris, [0, 1], None, None, False) + excinfo.match(r'mask must be a 1D array with the same length as the ' + + r'triangles array') + + with pytest.raises(ValueError) as excinfo: + triang = _tri.Triangulation(x, y, tris, None, [[1]], None, False) + excinfo.match(r'edges must be a 2D array with shape \(\?,2\)') + + with pytest.raises(ValueError) as excinfo: + triang = _tri.Triangulation(x, y, tris, None, None, [[-1]], False) + excinfo.match(r'neighbors must be a 2D array with the same shape as the ' + + r'triangles array') + + triang = _tri.Triangulation(x, y, tris, None, None, None, False) + + with pytest.raises(ValueError) as excinfo: + triang.calculate_plane_coefficients([]) + excinfo.match(r'z array must have same length as triangulation x and y ' + + r'arrays') + + with pytest.raises(ValueError) as excinfo: + triang.set_mask([0, 1]) + excinfo.match(r'mask must be a 1D array with the same length as the ' + + r'triangles array') + + # C++ TriContourGenerator. + with pytest.raises(TypeError) as excinfo: + tcg = _tri.TriContourGenerator() + excinfo.match(r'function takes exactly 2 arguments \(0 given\)') + + with pytest.raises(ValueError) as excinfo: + tcg = _tri.TriContourGenerator(triang, [1]) + excinfo.match(r'z must be a 1D array with the same length as the x and ' + + r'y arrays') + + z = [0, 1, 2] + tcg = _tri.TriContourGenerator(triang, z) + + with pytest.raises(ValueError) as excinfo: + tcg.create_filled_contour(1, 0) + excinfo.match(r'filled contour levels must be increasing') + + # C++ TrapezoidMapTriFinder. + with pytest.raises(TypeError) as excinfo: + trifinder = _tri.TrapezoidMapTriFinder() + excinfo.match(r'function takes exactly 1 argument \(0 given\)') + + trifinder = _tri.TrapezoidMapTriFinder(triang) + + with pytest.raises(ValueError) as excinfo: + trifinder.find_many([0], [0, 1]) + excinfo.match(r'x and y must be array_like with same shape') diff --git a/lib/matplotlib/tight_layout.py b/lib/matplotlib/tight_layout.py index 1f61d95e9f2f..9ca396dc0e3e 100644 --- a/lib/matplotlib/tight_layout.py +++ b/lib/matplotlib/tight_layout.py @@ -123,7 +123,11 @@ def auto_adjust_subplotpars(fig, renderer, for subplots, ax_bbox, (num1, num2) in zip(subplot_list, ax_bbox_list, num1num2_list): - tight_bbox_raw = union([ax.get_tightbbox(renderer) for ax in subplots]) + if all([not ax.get_visible() for ax in subplots]): + continue + + tight_bbox_raw = union([ax.get_tightbbox(renderer) for ax in subplots + if ax.get_visible()]) tight_bbox = TransformedBbox(tight_bbox_raw, fig.transFigure.inverted()) diff --git a/lib/matplotlib/tri/_tri_wrapper.cpp b/lib/matplotlib/tri/_tri_wrapper.cpp index 8980ac146678..3a20f5c9a489 100644 --- a/lib/matplotlib/tri/_tri_wrapper.cpp +++ b/lib/matplotlib/tri/_tri_wrapper.cpp @@ -53,24 +53,28 @@ static int PyTriangulation_init(PyTriangulation* self, PyObject* args, PyObject* if (x.empty() || y.empty() || x.dim(0) != y.dim(0)) { PyErr_SetString(PyExc_ValueError, "x and y must be 1D arrays of the same length"); + return -1; } // triangles. if (triangles.empty() || triangles.dim(1) != 3) { PyErr_SetString(PyExc_ValueError, "triangles must be a 2D array of shape (?,3)"); + return -1; } // Optional mask. if (!mask.empty() && mask.dim(0) != triangles.dim(0)) { PyErr_SetString(PyExc_ValueError, "mask must be a 1D array with the same length as the triangles array"); + return -1; } // Optional edges. if (!edges.empty() && edges.dim(1) != 2) { PyErr_SetString(PyExc_ValueError, "edges must be a 2D array with shape (?,2)"); + return -1; } // Optional neighbors. @@ -78,6 +82,7 @@ static int PyTriangulation_init(PyTriangulation* self, PyObject* args, PyObject* neighbors.dim(1) != triangles.dim(1))) { PyErr_SetString(PyExc_ValueError, "neighbors must be a 2D array with the same shape as the triangles array"); + return -1; } CALL_CPP_INIT("Triangulation", @@ -109,6 +114,7 @@ static PyObject* PyTriangulation_calculate_plane_coefficients(PyTriangulation* s if (z.empty() || z.dim(0) != self->ptr->get_npoints()) { PyErr_SetString(PyExc_ValueError, "z array must have same length as triangulation x and y arrays"); + return NULL; } Triangulation::TwoCoordinateArray result; @@ -167,6 +173,7 @@ static PyObject* PyTriangulation_set_mask(PyTriangulation* self, PyObject* args, if (!mask.empty() && mask.dim(0) != self->ptr->get_ntri()) { PyErr_SetString(PyExc_ValueError, "mask must be a 1D array with the same length as the triangles array"); + return NULL; } CALL_CPP("set_mask", (self->ptr->set_mask(mask))); @@ -251,6 +258,7 @@ static int PyTriContourGenerator_init(PyTriContourGenerator* self, PyObject* arg if (z.empty() || z.dim(0) != triangulation.get_npoints()) { PyErr_SetString(PyExc_ValueError, "z must be a 1D array with the same length as the x and y arrays"); + return -1; } CALL_CPP_INIT("TriContourGenerator", @@ -299,6 +307,7 @@ static PyObject* PyTriContourGenerator_create_filled_contour(PyTriContourGenerat { PyErr_SetString(PyExc_ValueError, "filled contour levels must be increasing"); + return NULL; } PyObject* result; @@ -407,6 +416,7 @@ static PyObject* PyTrapezoidMapTriFinder_find_many(PyTrapezoidMapTriFinder* self if (x.empty() || y.empty() || x.dim(0) != y.dim(0)) { PyErr_SetString(PyExc_ValueError, "x and y must be array_like with same shape"); + return NULL; } TrapezoidMapTriFinder::TriIndexArray result; diff --git a/license.py b/license.py deleted file mode 100644 index 81f19b1f177d..000000000000 --- a/license.py +++ /dev/null @@ -1,63 +0,0 @@ -import sys -import datetime - -if len(sys.argv) != 3: - print >>sys.stderr, 'Usage: license.py version_num filename' - -version = sys.argv[1] -year = datetime.date.today().year - -s = """\ -LICENSE AGREEMENT FOR MATPLOTLIB %(version)s --------------------------------------- - -1. This LICENSE AGREEMENT is between John D. Hunter ("JDH"), and the -Individual or Organization ("Licensee") accessing and otherwise using -matplotlib software in source or binary form and its associated -documentation. - -2. Subject to the terms and conditions of this License Agreement, JDH -hereby grants Licensee a nonexclusive, royalty-free, world-wide license -to reproduce, analyze, test, perform and/or display publicly, prepare -derivative works, distribute, and otherwise use matplotlib %(version)s -alone or in any derivative version, provided, however, that JDH's -License Agreement and JDH's notice of copyright, i.e., "Copyright (c) -2002-%(year)d John D. Hunter; All Rights Reserved" are retained in -matplotlib %(version)s alone or in any derivative version prepared by -Licensee. - -3. In the event Licensee prepares a derivative work that is based on or -incorporates matplotlib %(version)s or any part thereof, and wants to -make the derivative work available to others as provided herein, then -Licensee hereby agrees to include in any such work a brief summary of -the changes made to matplotlib %(version)s. - -4. JDH is making matplotlib %(version)s available to Licensee on an "AS -IS" basis. JDH MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, JDH MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF MATPLOTLIB %(version)s -WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. - -5. JDH SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF MATPLOTLIB -%(version)s FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR -LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING -MATPLOTLIB %(version)s, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF -THE POSSIBILITY THEREOF. - -6. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -7. Nothing in this License Agreement shall be deemed to create any -relationship of agency, partnership, or joint venture between JDH and -Licensee. This License Agreement does not grant permission to use JDH -trademarks or trade name in a trademark sense to endorse or promote -products or services of Licensee, or any third party. - -8. By copying, installing or otherwise using matplotlib %(version)s, -Licensee agrees to be bound by the terms and conditions of this License -Agreement. -""" % locals() - - -file(sys.argv[2], 'w').write(s) diff --git a/pytest.ini b/pytest.ini index 805e38201e28..24581de34526 100644 --- a/pytest.ini +++ b/pytest.ini @@ -1,5 +1,5 @@ [pytest] -norecursedirs = .git build ci dist doc extern lib/mpl_examples release tools unit venv +norecursedirs = .git build ci dist doc extern lib/mpl_examples release unit venv python_files = test_*.py markers = @@ -10,12 +10,14 @@ markers = pep8ignore = * E111 E114 E115 E116 E121 E122 E123 E124 E125 E126 E127 E128 E129 E131 E226 E240 E241 E242 E243 E244 E245 E246 E247 E248 E249 E265 E266 E704 W503 - boilerplate.py E501 + tools/boilerplate.py E501 setup.py E402 E501 setupext.py E301 E302 E501 setup_external_compile.py E302 E501 E711 versioneer.py ALL # External file. - visual_tests.py E302 E501 + tools/gh_api.py ALL # External file. + tools/github_stats.py ALL # External file. + tools/subset.py E221 E231 E251 E261 E302 E501 E701 E703 matplotlib/backends/qt_editor/formlayout.py E301 E402 E501 matplotlib/backends/backend_agg.py E225 E228 E231 E261 E301 E302 E303 E501 E701 diff --git a/setupext.py b/setupext.py index 3f6430cb15dd..1b2506da2c6b 100644 --- a/setupext.py +++ b/setupext.py @@ -1146,12 +1146,15 @@ def do_custom_build(self): os.path.isfile(tarball_cache_path)): if get_file_hash(tarball_cache_path) == LOCAL_FREETYPE_HASH: try: - # fail on Lpy, oh well - os.makedirs('build', exist_ok=True) + os.makedirs('build') + except OSError: + # Don't care if it exists. + pass + try: shutil.copy(tarball_cache_path, tarball_path) print('Using cached tarball: {}' .format(tarball_cache_path)) - except: + except OSError: # If this fails, oh well just re-download pass @@ -1165,12 +1168,12 @@ def do_custom_build(self): os.makedirs('build') sourceforge_url = ( - 'http://downloads.sourceforge.net/project/freetype' + 'https://downloads.sourceforge.net/project/freetype' '/freetype2/{0}/'.format(LOCAL_FREETYPE_VERSION) ) url_fmts = ( sourceforge_url + '{0}', - 'http://download.savannah.gnu.org/releases/freetype/{0}' + 'https://download.savannah.gnu.org/releases/freetype/{0}' ) for url_fmt in url_fmts: tarball_url = url_fmt.format(tarball) @@ -1186,12 +1189,15 @@ def do_custom_build(self): raise IOError("Failed to download freetype") if get_file_hash(tarball_path) == LOCAL_FREETYPE_HASH: try: - # this will fail on LPy, oh well - os.makedirs(tarball_cache_dir, exist_ok=True) + os.makedirs(tarball_cache_dir) + except OSError: + # Don't care if it exists. + pass + try: shutil.copy(tarball_path, tarball_cache_path) print('Cached tarball at: {}' .format(tarball_cache_path)) - except: + except OSError: # again, we do not care if this fails, can # always re download pass diff --git a/src/_contour_wrapper.cpp b/src/_contour_wrapper.cpp index e31a41c1716a..9770bd5e77fd 100644 --- a/src/_contour_wrapper.cpp +++ b/src/_contour_wrapper.cpp @@ -47,12 +47,20 @@ static int PyQuadContourGenerator_init(PyQuadContourGenerator* self, PyObject* a y.dim(1) != x.dim(1) || z.dim(1) != x.dim(1)) { PyErr_SetString(PyExc_ValueError, "x, y and z must all be 2D arrays with the same dimensions"); + return -1; + } + + if (z.dim(0) < 2 || z.dim(1) < 2) { + PyErr_SetString(PyExc_ValueError, + "x, y and z must all be at least 2x2 arrays"); + return -1; } // Mask array is optional, if set must be same size as other arrays. if (!mask.empty() && (mask.dim(0) != x.dim(0) || mask.dim(1) != x.dim(1))) { PyErr_SetString(PyExc_ValueError, "If mask is set it must be a 2D array with the same dimensions as x."); + return -1; } CALL_CPP_INIT("QuadContourGenerator", @@ -101,6 +109,7 @@ static PyObject* PyQuadContourGenerator_create_filled_contour(PyQuadContourGener { PyErr_SetString(PyExc_ValueError, "filled contour levels must be increasing"); + return NULL; } PyObject* result; diff --git a/src/_path.h b/src/_path.h index e847210ea1db..b7076c6712c3 100644 --- a/src/_path.h +++ b/src/_path.h @@ -872,6 +872,66 @@ bool path_intersects_path(PathIterator1 &p1, PathIterator2 &p2) return false; } +// returns whether the segment from (x1,y1) to (x2,y2) +// intersects the rectangle centered at (cx,cy) with size (w,h) +// see doc/segment_intersects_rectangle.svg for a more detailed explanation +inline bool segment_intersects_rectangle(double x1, double y1, + double x2, double y2, + double cx, double cy, + double w, double h) +{ + return fabs(x1 + x2 - 2.0 * cx) < fabs(x1 - x2) + w && + fabs(y1 + y2 - 2.0 * cy) < fabs(y1 - y2) + h && + 2.0 * fabs((x1 - cx) * (y1 - y2) - (y1 - cy) * (x1 - x2)) < + w * fabs(y1 - y2) + h * fabs(x1 - x2); +} + +template +bool path_intersects_rectangle(PathIterator &path, + double rect_x1, double rect_y1, + double rect_x2, double rect_y2, + bool filled) +{ + typedef PathNanRemover no_nans_t; + typedef agg::conv_curve curve_t; + + if (path.total_vertices() == 0) { + return false; + } + + no_nans_t no_nans(path, true, path.has_curves()); + curve_t curve(no_nans); + + double cx = (rect_x1 + rect_x2) * 0.5, cy = (rect_y1 + rect_y2) * 0.5; + double w = fabs(rect_x1 - rect_x2), h = fabs(rect_y1 - rect_y2); + double xmin = std::min(rect_x1, rect_x2), xmax = std::max(rect_x1, rect_x2); + double ymin = std::min(rect_x1, rect_x2), ymax = std::max(rect_x1, rect_x2); + + double x1, y1, x2, y2; + + curve.vertex(&x1, &y1); + if (2.0 * fabs(x1 - cx) <= w && 2.0 * fabs(y1 - cy) <= h) { + return true; + } + + while (curve.vertex(&x2, &y2) != agg::path_cmd_stop) { + if (segment_intersects_rectangle(x1, y1, x2, y2, cx, cy, w, h)) { + return true; + } + x1 = x2; + y1 = y2; + } + + if (filled) { + agg::trans_affine trans; + if (point_in_path(cx, cy, 0.0, path, trans)) { + return true; + } + } + + return false; +} + template void convert_path_to_polygons(PathIterator &path, agg::trans_affine &trans, diff --git a/src/_path_wrapper.cpp b/src/_path_wrapper.cpp index 047e8c5c3107..e19b85038161 100644 --- a/src/_path_wrapper.cpp +++ b/src/_path_wrapper.cpp @@ -521,6 +521,39 @@ static PyObject *Py_path_intersects_path(PyObject *self, PyObject *args, PyObjec } } +const char *Py_path_intersects_rectangle__doc__ = "path_intersects_rectangle(path, rect_x1, rect_y1, rect_x2, rect_y2, filled=False)"; + +static PyObject *Py_path_intersects_rectangle(PyObject *self, PyObject *args, PyObject *kwds) +{ + py::PathIterator path; + double rect_x1, rect_y1, rect_x2, rect_y2; + int filled = 0; + const char *names[] = { "path", "rect_x1", "rect_y1", "rect_x2", "rect_y2", "filled", NULL }; + bool result; + + if (!PyArg_ParseTupleAndKeywords(args, + kwds, + "O&dddd|i:path_intersects_rectangle", + (char **)names, + &convert_path, + &path, + &rect_x1, + &rect_y1, + &rect_x2, + &rect_y2, + &filled)) { + return NULL; + } + + CALL_CPP("path_intersects_rectangle", (result = path_intersects_rectangle(path, rect_x1, rect_y1, rect_x2, rect_y2, filled))); + + if (result) { + Py_RETURN_TRUE; + } else { + Py_RETURN_FALSE; + } +} + const char *Py_convert_path_to_polygons__doc__ = "convert_path_to_polygons(path, trans, width=0, height=0)"; @@ -819,6 +852,7 @@ extern "C" { {"affine_transform", (PyCFunction)Py_affine_transform, METH_VARARGS, Py_affine_transform__doc__}, {"count_bboxes_overlapping_bbox", (PyCFunction)Py_count_bboxes_overlapping_bbox, METH_VARARGS, Py_count_bboxes_overlapping_bbox__doc__}, {"path_intersects_path", (PyCFunction)Py_path_intersects_path, METH_VARARGS|METH_KEYWORDS, Py_path_intersects_path__doc__}, + {"path_intersects_rectangle", (PyCFunction)Py_path_intersects_rectangle, METH_VARARGS|METH_KEYWORDS, Py_path_intersects_rectangle__doc__}, {"convert_path_to_polygons", (PyCFunction)Py_convert_path_to_polygons, METH_VARARGS|METH_KEYWORDS, Py_convert_path_to_polygons__doc__}, {"cleanup_path", (PyCFunction)Py_cleanup_path, METH_VARARGS, Py_cleanup_path__doc__}, {"convert_to_string", (PyCFunction)Py_convert_to_string, METH_VARARGS, Py_convert_to_string__doc__}, diff --git a/src/doc/segment_intersects_rectangle.svg b/src/doc/segment_intersects_rectangle.svg new file mode 100644 index 000000000000..6c5f82fc2bac --- /dev/null +++ b/src/doc/segment_intersects_rectangle.svg @@ -0,0 +1,1689 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + We want to check whether a segmentof a path intersects a rectangle. + We do this by checking whether theMinkowski difference contains the origin. + (x1,y1) + (x2,y2) + (cx,cy) + + + w + h + + + + + + + + + + + + + + + + + + + + + (x1-cx,y1-cy) + ((x1+x2)/2 - cx, + (y1+y2)/2 - cy) + + + (x2-cx,y2-cy) + + + w/2 + + + + + + + h/2 + + + + + + + + w/2 + + + + + + h/2 + + + + + w/2 + + + + + + + h/2 + + + + + + + + w/2 + + + + + + h/2 + + + + + The Minkowski difference can be constructed as the intersection of three regions.The segment intersects the rectangle if and only if the origin is inside all three regions. + + + + + + + + + ((x1+x2)/2 - cx, + (y1+y2)/2 - cy) + + + + + abs((x1+x2)/2 - cx) < (abs(x1-x2) + w)/2 + abs((x1-cx) * (y1-y2) - (y1-cy) * (x1-x2)) + abs((y1+y2)/2 - cy) < (abs(y1-y2) + h)/2 + h + abs(y1-y2) + w + + + + + + + abs(x1-x2) + + + + + + + + + + + + + + + + + (0,0) + (0,0) + < w/2 * abs(y1-y2) + h/2 * abs(x1-x2) + + diff --git a/tools/README.txt b/tools/README.txt new file mode 100644 index 000000000000..d6438c7654f0 --- /dev/null +++ b/tools/README.txt @@ -0,0 +1 @@ +Tools developed for Matplotlib diff --git a/boilerplate.py b/tools/boilerplate.py similarity index 99% rename from boilerplate.py rename to tools/boilerplate.py index 6aabc83cb892..5c34b4f869f2 100644 --- a/boilerplate.py +++ b/tools/boilerplate.py @@ -365,7 +365,7 @@ def format_value(value): def build_pyplot(): - pyplot_path = os.path.join(os.path.dirname(__file__), 'lib', + pyplot_path = os.path.join(os.path.dirname(__file__), "..", 'lib', 'matplotlib', 'pyplot.py') pyplot_orig = open(pyplot_path, 'r').readlines() diff --git a/tools/make_icons.py b/tools/make_icons.py index a0f664da16ce..d673d971d041 100755 --- a/tools/make_icons.py +++ b/tools/make_icons.py @@ -11,7 +11,7 @@ """ import matplotlib -matplotlib.use('agg') +matplotlib.use('agg') # noqa import six diff --git a/tools/test_triage.py b/tools/triage_tests.py similarity index 96% rename from tools/test_triage.py rename to tools/triage_tests.py index f378ef371ff8..139116d33d57 100644 --- a/tools/test_triage.py +++ b/tools/triage_tests.py @@ -11,7 +11,7 @@ If you ran the tests from the top-level of a source checkout, simply run: - python tools/test_triage.py + python tools/triage_tests.py Otherwise, you can manually select the location of `result_images` on the commandline. @@ -187,8 +187,8 @@ def set_entry(self, index): def set_large_image(self, index): self.thumbnails[self.current_thumbnail].setFrameShape(0) self.current_thumbnail = index - pixmap = QtGui.QPixmap( - self.entries[self.current_entry].thumbnails[self.current_thumbnail]) + pixmap = QtGui.QPixmap(self.entries[self.current_entry] + .thumbnails[self.current_thumbnail]) self.image_display.setPixmap(pixmap) self.thumbnails[self.current_thumbnail].setFrameShape(1) @@ -212,9 +212,9 @@ def keyPressEvent(self, e): elif e.key() == QtCore.Qt.Key_Right: self.set_large_image((self.current_thumbnail + 1) % 3) elif e.key() == QtCore.Qt.Key_Up: - self.set_entry(max((self.current_entry - 1), 0)) + self.set_entry(max(self.current_entry - 1, 0)) elif e.key() == QtCore.Qt.Key_Down: - self.set_entry(min((self.current_entry + 1), len(self.entries) - 1)) + self.set_entry(min(self.current_entry + 1, len(self.entries) - 1)) elif e.key() == QtCore.Qt.Key_A: self.accept_test() elif e.key() == QtCore.Qt.Key_R: @@ -249,7 +249,8 @@ def __init__(self, path, root, source): self.extension = extension self.generated = basename + '.' + extension self.expected = basename + '-expected.' + extension - self.expected_display = basename + '-expected' + display_extension + '.png' + self.expected_display = (basename + '-expected' + display_extension + + '.png') self.generated_display = basename + display_extension + '.png' self.name = os.path.join(self.reldir, self.basename) self.destdir = self.get_dest_dir(self.reldir) diff --git a/tools/visualize_tests.py b/tools/visualize_tests.py new file mode 100644 index 000000000000..539dd4db2eb4 --- /dev/null +++ b/tools/visualize_tests.py @@ -0,0 +1,137 @@ +#!/usr/bin/env python +# +# This builds a html page of all images from the image comparison tests +# and opens that page in the browser. +# +# $ python tools/visualize_tests.py +# + +import argparse +import os +from collections import defaultdict + + +html_template = """ + +{failed} +{body} + +""" + +subdir_template = """

{subdir}

+ +{rows} +
nameactualexpecteddiff
+""" + +failed_template = """

Only Failed

+ +{rows} +
nameactualexpecteddiff
+""" + +row_template = ('' + '{0}{1}' + '{2}' + '
' + '{4}' + '') + +linked_image_template = '' + + +def run(show_browser=True): + """ + Build a website for visual comparison + """ + image_dir = "result_images" + _subdirs = (name + for name in os.listdir(image_dir) + if os.path.isdir(os.path.join(image_dir, name))) + + failed_rows = [] + body_sections = [] + for subdir in sorted(_subdirs): + if subdir == "test_compare_images": + # These are the images which test the image comparison functions. + continue + + pictures = defaultdict(dict) + for file in os.listdir(os.path.join(image_dir, subdir)): + if os.path.isdir(os.path.join(image_dir, subdir, file)): + continue + fn, fext = os.path.splitext(file) + if fext != ".png": + continue + # Always use / for URLs. + if "-failed-diff" in fn: + pictures[fn[:-12]]["f"] = "/".join((subdir, file)) + elif "-expected" in fn: + pictures[fn[:-9]]["e"] = "/".join((subdir, file)) + else: + pictures[fn]["c"] = "/".join((subdir, file)) + + subdir_rows = [] + for name, test in sorted(pictures.items()): + expected_image = test.get('e', '') + actual_image = test.get('c', '') + + if 'f' in test: + # A real failure in the image generation, resulting in + # different images. + status = " (failed)" + failed = 'diff'.format(test['f']) + current = linked_image_template.format(actual_image) + failed_rows.append(row_template.format(name, "", current, + expected_image, failed)) + elif 'c' not in test: + # A failure in the test, resulting in no current image + status = " (failed)" + failed = '--' + current = '(Failure in test, no image produced)' + failed_rows.append(row_template.format(name, "", current, + expected_image, failed)) + else: + status = " (passed)" + failed = '--' + current = linked_image_template.format(actual_image) + + subdir_rows.append(row_template.format(name, status, current, + expected_image, failed)) + + body_sections.append( + subdir_template.format(subdir=subdir, rows='\n'.join(subdir_rows))) + + if failed_rows: + failed = failed_template.format(rows='\n'.join(failed_rows)) + else: + failed = '' + body = ''.join(body_sections) + html = html_template.format(failed=failed, body=body) + index = os.path.join(image_dir, "index.html") + with open(index, "w") as f: + f.write(html) + + show_message = not show_browser + if show_browser: + try: + import webbrowser + webbrowser.open(index) + except: + show_message = True + + if show_message: + print("Open {} in a browser for a visual comparison.".format(index)) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--no-browser', action='store_true', + help="Don't show browser after creating index page.") + args = parser.parse_args() + run(show_browser=not args.no_browser) diff --git a/visual_tests.py b/visual_tests.py deleted file mode 100644 index b2c37eb78906..000000000000 --- a/visual_tests.py +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/env python -# -# This builds a html page of all images from the image comparison tests -# and opens that page in the browser. -# -# $ python visual_tests.py -# - -import os -import time -import six - -from collections import defaultdict - -def run(): - # Build a website for visual comparison - image_dir = "result_images" - # build the website - _html = "" - _html += """ - \n""" - _subdirs = [name for name in os.listdir(image_dir) if os.path.isdir(os.path.join(image_dir, name))] - # loop over all pictures - _row = '{0} {1}{2}{4}\n' - _failed = "" - _failed += "

Only Failed

" - _failed += "\n\n" - _has_failure = False - _body = "" - for subdir in _subdirs: - if subdir == "test_compare_images": - # these are the image which test the image comparison functions... - continue - pictures = defaultdict(dict) - for file in os.listdir(os.path.join(image_dir, subdir)): - if os.path.isdir(os.path.join(image_dir, subdir, file)): - continue - fn, fext = os.path.splitext(file) - if fext != ".png": - continue - # Always use / for URLs. - if "-failed-diff" in fn: - pictures[fn[:-12]]["f"] = "/".join((subdir, file)) - elif "-expected" in fn: - pictures[fn[:-9]]["e"] = "/".join((subdir, file)) - else: - pictures[fn]["c"] = "/".join((subdir, file)) - - _body += "

{0}

".format(subdir) - _body += "
nameactualexpecteddiff
\n\n" - for name, test in six.iteritems(pictures): - if test.get("f", None): - # a real failure in the image generation, resulting in different images - _has_failure = True - s = "(failed)" - failed = 'diff'.format(test.get("f", "")) - current = ''.format(test.get("c", "")) - _failed += _row.format(name, "", current, test.get("e", ""), failed) - elif test.get("c", None) is None: - # A failure in the test, resulting in no current image - _has_failure = True - s = "(failed)" - failed = '--' - current = '(Failure in test, no image produced)' - _failed += _row.format(name, "", current, test.get("e", ""), failed) - else: - s = "(passed)" - failed = '--' - current = ''.format(test.get("c", "")) - _body += _row.format(name, "", current, test.get("e", ""), failed) - _body += "
nameactualexpecteddiff
\n" - _failed += "\n" - if _has_failure: - _html += _failed - _html += _body - _html += "\n" - index = os.path.join(image_dir, "index.html") - with open(index, "w") as f: - f.write(_html) - try: - import webbrowser - webbrowser.open(index) - except: - print("Open {} in a browser for a visual comparison.".format(index)) - -if __name__ == '__main__': - run() From 7bbecdd8fbe1c2fcce93793948d4f7ce30f171be Mon Sep 17 00:00:00 2001 From: Isa Hassen Date: Sat, 18 Mar 2017 14:36:02 -0400 Subject: [PATCH 4/4] test for issue #7741 --- lib/matplotlib/tests/test_backend_ps.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/matplotlib/tests/test_backend_ps.py b/lib/matplotlib/tests/test_backend_ps.py index 79fd5997e2a9..fcf51ac20f25 100644 --- a/lib/matplotlib/tests/test_backend_ps.py +++ b/lib/matplotlib/tests/test_backend_ps.py @@ -188,3 +188,12 @@ def test_determinism_all(): def test_determinism_all_tex(): """Test for reproducible PS/tex output""" _determinism_check(format="ps", usetex=True) + + +@needs_tex +def test_usetex_param(): + """Test for Issue #7741 (this shouldn't crash)""" + fig = plt.figure() + plt.text(0.5, 0.5, 'some text, $math mode$', + ha='center', va='center', usetex=True) + fig.savefig('test.ps')