Merge lp:~fcole90/ubuntu/precise/python-reportlab/fix-for-1005187 into lp:ubuntu/precise/python-reportlab

Proposed by fcole90
Status: Merged
Merge reported by: Martin Pitt
Merged at revision: not available
Proposed branch: lp:~fcole90/ubuntu/precise/python-reportlab/fix-for-1005187
Merge into: lp:ubuntu/precise/python-reportlab
Diff against target: 24029 lines (+8641/-4994)
195 files modified
CHANGES.txt (+49/-0)
PKG-INFO (+1/-1)
debian/README.Debian (+1/-1)
debian/changelog (+11/-5)
debian/control (+2/-2)
debian/copyright (+6/-6)
debian/rules (+6/-0)
demos/colors/colortest.py (+2/-2)
demos/gadflypaper/gfe.py (+2/-2)
demos/odyssey/dodyssey.py (+2/-2)
demos/odyssey/fodyssey.py (+2/-2)
demos/odyssey/odyssey.py (+2/-2)
demos/stdfonts/stdfonts.py (+2/-2)
demos/tests/testdemos.py (+2/-2)
docs/reference/genreference.py (+2/-2)
docs/reference/reportlab-reference.pdf (+168/-168)
docs/userguide/app_demos.py (+1/-1)
docs/userguide/ch1_intro.py (+73/-53)
docs/userguide/ch2_graphics.py (+8/-9)
docs/userguide/ch2a_fonts.py (+1/-1)
docs/userguide/ch3_pdffeatures.py (+1/-1)
docs/userguide/ch4_platypus_concepts.py (+1/-1)
docs/userguide/ch5_paragraphs.py (+1/-1)
docs/userguide/ch6_tables.py (+74/-8)
docs/userguide/ch7_custom.py (+1/-1)
docs/userguide/genuserguide.py (+2/-2)
docs/userguide/graph_charts.py (+245/-64)
docs/userguide/graph_concepts.py (+2/-2)
docs/userguide/graph_intro.py (+2/-2)
docs/userguide/graph_shapes.py (+2/-2)
docs/userguide/graph_widgets.py (+2/-2)
setup.py (+8/-8)
src/reportlab/__init__.py (+13/-9)
src/reportlab/graphics/__init__.py (+2/-2)
src/reportlab/graphics/barcode/__init__.py (+2/-1)
src/reportlab/graphics/barcode/eanbc.py (+18/-11)
src/reportlab/graphics/barcode/test.py (+4/-0)
src/reportlab/graphics/barcode/usps4s.py (+2/-2)
src/reportlab/graphics/barcode/widgets.py (+2/-2)
src/reportlab/graphics/charts/__init__.py (+2/-2)
src/reportlab/graphics/charts/areas.py (+2/-2)
src/reportlab/graphics/charts/axes.py (+100/-45)
src/reportlab/graphics/charts/barcharts.py (+111/-24)
src/reportlab/graphics/charts/doughnut.py (+69/-25)
src/reportlab/graphics/charts/legends.py (+2/-2)
src/reportlab/graphics/charts/linecharts.py (+2/-2)
src/reportlab/graphics/charts/lineplots.py (+36/-13)
src/reportlab/graphics/charts/markers.py (+2/-2)
src/reportlab/graphics/charts/piecharts.py (+478/-144)
src/reportlab/graphics/charts/textlabels.py (+2/-2)
src/reportlab/graphics/charts/utils.py (+70/-21)
src/reportlab/graphics/renderPDF.py (+11/-5)
src/reportlab/graphics/renderPM.py (+28/-19)
src/reportlab/graphics/renderPS.py (+10/-5)
src/reportlab/graphics/renderSVG.py (+18/-7)
src/reportlab/graphics/renderbase.py (+1/-1)
src/reportlab/graphics/shapes.py (+83/-5)
src/reportlab/graphics/testdrawings.py (+1/-1)
src/reportlab/graphics/testshapes.py (+8/-4)
src/reportlab/graphics/widgetbase.py (+2/-2)
src/reportlab/graphics/widgets/__init__.py (+2/-2)
src/reportlab/graphics/widgets/grids.py (+18/-5)
src/reportlab/graphics/widgets/markers.py (+2/-2)
src/reportlab/graphics/widgets/signsandsymbols.py (+2/-2)
src/reportlab/graphics/widgets/table.py (+2/-2)
src/reportlab/lib/PyFontify.py (+2/-2)
src/reportlab/lib/__init__.py (+2/-2)
src/reportlab/lib/abag.py (+2/-2)
src/reportlab/lib/arciv.py (+2/-2)
src/reportlab/lib/attrmap.py (+2/-2)
src/reportlab/lib/boxstuff.py (+2/-2)
src/reportlab/lib/codecharts.py (+1/-1)
src/reportlab/lib/colors.py (+47/-48)
src/reportlab/lib/corp.py (+2/-2)
src/reportlab/lib/enums.py (+2/-2)
src/reportlab/lib/extformat.py (+2/-2)
src/reportlab/lib/fontfinder.py (+2/-2)
src/reportlab/lib/fonts.py (+2/-2)
src/reportlab/lib/formatters.py (+2/-2)
src/reportlab/lib/geomutils.py (+2/-2)
src/reportlab/lib/logger.py (+2/-2)
src/reportlab/lib/pagesizes.py (+2/-2)
src/reportlab/lib/pdfencrypt.py (+2/-2)
src/reportlab/lib/pygments2xpre.py (+2/-3)
src/reportlab/lib/randomtext.py (+26/-4)
src/reportlab/lib/rltempfile.py (+2/-2)
src/reportlab/lib/sequencer.py (+10/-2)
src/reportlab/lib/set_ops.py (+2/-2)
src/reportlab/lib/styles.py (+33/-3)
src/reportlab/lib/testutils.py (+2/-2)
src/reportlab/lib/textsplit.py (+72/-35)
src/reportlab/lib/units.py (+2/-2)
src/reportlab/lib/utils.py (+19/-13)
src/reportlab/lib/validators.py (+2/-2)
src/reportlab/lib/yaml.py (+2/-2)
src/reportlab/pdfbase/__init__.py (+2/-2)
src/reportlab/pdfbase/_cidfontdata.py (+2/-2)
src/reportlab/pdfbase/_fontdata.py (+2/-2)
src/reportlab/pdfbase/cidfonts.py (+2/-2)
src/reportlab/pdfbase/pdfdoc.py (+174/-7)
src/reportlab/pdfbase/pdfmetrics.py (+2/-2)
src/reportlab/pdfbase/pdfutils.py (+2/-2)
src/reportlab/pdfbase/ttfonts.py (+2/-2)
src/reportlab/pdfgen/__init__.py (+2/-2)
src/reportlab/pdfgen/canvas.py (+132/-92)
src/reportlab/pdfgen/pathobject.py (+49/-22)
src/reportlab/pdfgen/pdfgeom.py (+2/-2)
src/reportlab/pdfgen/pdfimages.py (+2/-2)
src/reportlab/pdfgen/textobject.py (+16/-5)
src/reportlab/platypus/__init__.py (+3/-3)
src/reportlab/platypus/doctemplate.py (+18/-6)
src/reportlab/platypus/figures.py (+2/-2)
src/reportlab/platypus/flowables.py (+544/-17)
src/reportlab/platypus/frames.py (+11/-5)
src/reportlab/platypus/paragraph.py (+167/-53)
src/reportlab/platypus/paraparser.py (+32/-2)
src/reportlab/platypus/tableofcontents.py (+2/-2)
src/reportlab/platypus/tables.py (+106/-41)
src/reportlab/platypus/xpreformatted.py (+4/-2)
src/reportlab/rl_config.py (+2/-2)
src/rl_addons/renderPM/_renderPM.c (+5/-5)
src/rl_addons/renderPM/libart_lgpl/art_svp_ops.c (+28/-1)
src/rl_addons/renderPM/libart_lgpl/art_vpath_bpath.c (+13/-2)
src/rl_addons/rl_accel/_rl_accel.c (+3/-3)
tests/__init__.py (+1/-1)
tests/runAll.py (+2/-2)
tests/test_charts_textlabels.py (+1/-1)
tests/test_crypto_algorithms.py (+2/-2)
tests/test_docstrings.py (+1/-1)
tests/test_encrypt.py (+2/-2)
tests/test_geomutils.py (+2/-2)
tests/test_graphics_charts.py (+51/-2)
tests/test_graphics_images.py (+1/-1)
tests/test_graphics_layout.py (+1/-1)
tests/test_graphics_speed.py (+2/-2)
tests/test_hello.py (+2/-2)
tests/test_images.py (+2/-2)
tests/test_invariant.py (+2/-2)
tests/test_lib_colors.py (+2/-2)
tests/test_lib_sequencer.py (+2/-2)
tests/test_lib_utils.py (+2/-2)
tests/test_multibyte_chs.py (+1/-1)
tests/test_multibyte_cht.py (+1/-1)
tests/test_multibyte_jpn.py (+1/-1)
tests/test_paragraphs.py (+118/-84)
tests/test_pdfbase_pdfmetrics.py (+2/-2)
tests/test_pdfbase_pdfutils.py (+2/-2)
tests/test_pdfbase_postscript.py (+2/-2)
tests/test_pdfencryption.py (+1/-1)
tests/test_pdfgen_callback.py (+2/-2)
tests/test_pdfgen_general.py (+91/-19)
tests/test_pdfgen_links.py (+2/-2)
tests/test_pdfgen_overprint.py (+2/-2)
tests/test_pdfgen_pagemodes.py (+2/-2)
tests/test_pdfgen_pycanvas.py (+2/-2)
tests/test_platypus_breaking.py (+2/-2)
tests/test_platypus_cjk_wrap.py (+101/-0)
tests/test_platypus_general.py (+2/-2)
tests/test_platypus_indents.py (+2/-2)
tests/test_platypus_index.py (+2/-2)
tests/test_platypus_leftright.py (+2/-2)
tests/test_platypus_lists.py (+106/-0)
tests/test_platypus_paragraphs.py (+83/-3)
tests/test_platypus_paraparser.py (+1/-1)
tests/test_platypus_pleaseturnover.py (+2/-2)
tests/test_platypus_preformatted.py (+218/-0)
tests/test_platypus_programming.py (+2/-2)
tests/test_platypus_tables.py (+22/-3)
tests/test_platypus_toc.py (+70/-4)
tests/test_platypus_wrapping.py (+104/-0)
tests/test_platypus_xref.py (+2/-2)
tests/test_pyfiles.py (+2/-2)
tests/test_renderSVG.py (+91/-2)
tests/test_source_chars.py (+2/-2)
tests/test_utils.py (+2/-2)
tests/test_widgetbase_tpc.py (+2/-2)
tools/__init__.py (+1/-1)
tools/docco/__init__.py (+1/-1)
tools/docco/codegrab.py (+1/-1)
tools/docco/docpy.py (+1/-1)
tools/docco/examples.py (+1/-1)
tools/docco/graphdocpy.py (+1/-1)
tools/docco/reportlab.graphics.pdf (+4108/-3600)
tools/docco/rl_doc_utils.py (+4/-3)
tools/docco/rltemplate.py (+4/-4)
tools/docco/stylesheet.py (+3/-4)
tools/docco/t_parse.py (+1/-1)
tools/docco/yaml.py (+1/-1)
tools/docco/yaml2pdf.py (+1/-1)
tools/pythonpoint/__init__.py (+1/-1)
tools/pythonpoint/customshapes.py (+2/-2)
tools/pythonpoint/pythonpoint.py (+2/-2)
tools/pythonpoint/styles/__init__.py (+1/-1)
tools/pythonpoint/styles/horrible.py (+2/-2)
tools/pythonpoint/styles/modern.py (+2/-2)
To merge this branch: bzr merge lp:~fcole90/ubuntu/precise/python-reportlab/fix-for-1005187
Reviewer Review Type Date Requested Status
Dmitry Shachnev Needs Resubmitting
Ubuntu branches Pending
Review via email: mp+158774@code.launchpad.net

Description of the change

Fixes bug LP: #1005187, edited the README.Debian to show the correct path in which the examples and documents are.

To post a comment you must log in.
Revision history for this message
Dmitry Shachnev (mitya57) wrote :

Did you forward this to Debian?

Also, please resumbit this MP against lp:ubuntu/python-reportlab, not against lp:ubuntu/precise/python-reportlab. Thanks!

review: Needs Resubmitting
Revision history for this message
Iain Lane (laney) wrote :

I just fixed this up and pushed it to ubuntu:python-reportlab. It's not worth uploading on its own but should be picked up next time.

Revision history for this message
Iain Lane (laney) wrote :

I'd appreciate it if you could forward this to Debian too BTW. See https://wiki.ubuntu.com/Debian/Bugs

Revision history for this message
fcole90 (fcole90) wrote :

Ok, forwarded also to debian.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'CHANGES.txt'
--- CHANGES.txt 2010-12-06 12:45:44 +0000
+++ CHANGES.txt 2013-04-14 00:52:26 +0000
@@ -8,6 +8,55 @@
8The contributors lists are in no order and apologies to those accidentally not8The contributors lists are in no order and apologies to those accidentally not
9mentioned. If we missed you, please let us know!9mentioned. If we missed you, please let us know!
1010
11#################################################################################
12#################### RELEASE 2.6 27/09/2012 #################
13#################################################################################
14
15This is a minor release focusing mainly on improved documentation. There are a
16number of minor enhancements, and a larger number of previous-undocumented
17enhancements which we have documented better.
18
19
20###General changes
21 * Manuals have been reformatted with more pleasing code snippets and tables of
22 contents, and reviewed and expanded
23
24###Flowing documents (Platypus):
25 * Added support for HTML-style list objects
26 * Added flexible mechanism for drawing bullets
27 * Allowed XPreformatted objects to use Asian line wrapping
28 * Added an 'autoNextPageTemplate' attribute to PageTemplates. For example you
29 can now set up a 'chapter first page template' which will always be followed
30 by a 'continuation template' on the next page break, saving the programmer from
31 having to issue control flow commands in the story.
32 * added a TopPadder flowable, which will 'wrap' another Flowable and move it
33 to the bottom of the current page.
34 * More helpful error messages when large tables cannot be rendered
35 * Documentation for images within text (test_032_images)
36 * Trailing dots for use on contents pages
37
38
39
40###Charts and graphics:
41 * Support for UPCA bar codes
42 * We now have a semi-intelligent system for labelling pie charts with
43 callout lines. Thanks to James Martin-Collar, a maths student at Warwick
44 University, who did this as his summer internship.
45 * Axes - added startOffset and endOffset properties; allowed for axis
46 background annotations.
47 * Bar charts - allow more control of z Index (i.e. drawing order of axes and
48 lines)
49 * Pie charts - fixed bugs in 3d appearance
50 * SVG output back end has seen some bugs fixed and now outputs resizeable SVG
51
52###Contributors:
53 * Alex Buck
54 * Felix Labrecque <felixl@densi.com>
55 * Peter Johnson <johnson.peter@gmail.com>
56 * James Martin-Collar
57 * Guillaume Francois
58
59
1160
12#################################################################################61#################################################################################
13#################### RELEASE 2.5 at 18:00 GMT 01/Oct/2010 #################62#################### RELEASE 2.5 at 18:00 GMT 01/Oct/2010 #################
1463
=== modified file 'PKG-INFO'
--- PKG-INFO 2010-12-06 12:45:44 +0000
+++ PKG-INFO 2013-04-14 00:52:26 +0000
@@ -1,7 +1,7 @@
11
2Metadata-Version: 1.02Metadata-Version: 1.0
3Name: reportlab3Name: reportlab
4Version: 2.54Version: 2.6
5Summary: The ReportLab Toolkit5Summary: The ReportLab Toolkit
6Home-page: http://www.reportlab.com/6Home-page: http://www.reportlab.com/
7Author: Andy Robinson, Robin Becker, the ReportLab team and the community7Author: Andy Robinson, Robin Becker, the ReportLab team and the community
88
=== modified file 'debian/README.Debian'
--- debian/README.Debian 2006-02-14 14:38:23 +0000
+++ debian/README.Debian 2013-04-14 00:52:26 +0000
@@ -6,7 +6,7 @@
6Python.6Python.
77
8Examples and documentation can be found in the python-reportlab-doc package8Examples and documentation can be found in the python-reportlab-doc package
9in /usr/share/doc/python-reportlab-doc.9in /usr/share/pyshared/reportlab/.
1010
1111
12 05/22/2000,12 05/22/2000,
1313
=== modified file 'debian/changelog'
--- debian/changelog 2011-12-31 02:12:00 +0000
+++ debian/changelog 2013-04-14 00:52:26 +0000
@@ -1,8 +1,14 @@
1python-reportlab (2.5-1.1build1) precise; urgency=low1python-reportlab (2.6-1ubuntu1) precise; urgency=low
22
3 * Rebuild to drop python2.6 dependencies.3 * Edited example and documentation path in README.Debian (LP: #1005187)
44
5 -- Matthias Klose <doko@ubuntu.com> Sat, 31 Dec 2011 02:12:00 +00005 -- Fabio Colella <fcole90@gmail.com> Sun, 14 Apr 2013 02:31:26 +0200
6
7python-reportlab (2.6-1) experimental; urgency=low
8
9 * New upstream version.
10
11 -- Matthias Klose <doko@debian.org> Thu, 31 Jan 2013 21:08:28 +0100
612
7python-reportlab (2.5-1.1) unstable; urgency=low13python-reportlab (2.5-1.1) unstable; urgency=low
814
915
=== modified file 'debian/control'
--- debian/control 2011-04-16 13:00:22 +0000
+++ debian/control 2013-04-14 00:52:26 +0000
@@ -3,7 +3,7 @@
3Priority: optional3Priority: optional
4Maintainer: Matthias Klose <doko@debian.org>4Maintainer: Matthias Klose <doko@debian.org>
5Uploaders: Igor Stroh <jenner@debian.org>, Debian Python Modules Team <python-modules-team@lists.alioth.debian.org>5Uploaders: Igor Stroh <jenner@debian.org>, Debian Python Modules Team <python-modules-team@lists.alioth.debian.org>
6Standards-Version: 3.9.16Standards-Version: 3.9.4
7XS-Python-Version: >= 2.47XS-Python-Version: >= 2.4
8Build-Depends: debhelper (>= 5.0.37.1), python-all-dev (>= 2.6.5-9~), python-all-dbg, libart-2.0-dev, libfreetype6-dev, sharutils8Build-Depends: debhelper (>= 5.0.37.1), python-all-dev (>= 2.6.5-9~), python-all-dbg, libart-2.0-dev, libfreetype6-dev, sharutils
9Build-Depends-Indep: python-imaging, python-sphinx9Build-Depends-Indep: python-imaging, python-sphinx
@@ -37,7 +37,7 @@
37Package: python-reportlab-doc37Package: python-reportlab-doc
38Section: doc38Section: doc
39Architecture: all39Architecture: all
40Depends: ${misc:Depends}40Depends: ${misc:Depends}, libjs-underscore
41Suggests: python-reportlab41Suggests: python-reportlab
42Description: Documentation for the ReportLab Python library (PDF format)42Description: Documentation for the ReportLab Python library (PDF format)
43 ReportLab is a library that lets you directly create documents in43 ReportLab is a library that lets you directly create documents in
4444
=== modified file 'debian/copyright'
--- debian/copyright 2010-12-06 12:45:44 +0000
+++ debian/copyright 2013-04-14 00:52:26 +0000
@@ -71,7 +71,7 @@
71 *71 *
72 * You should have received a copy of the GNU Lesser General Public72 * You should have received a copy of the GNU Lesser General Public
73 * License along with this library; if not, write to the Free Software73 * License along with this library; if not, write to the Free Software
74 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA74 * if not, see <http://www.gnu.org/licenses/>.
75*/75*/
7676
77/*77/*
@@ -131,8 +131,8 @@
131 Lesser General Public License for more details.131 Lesser General Public License for more details.
132132
133 You should have received a copy of the GNU Lesser General Public133 You should have received a copy of the GNU Lesser General Public
134 License along with this package; if not, write to the Free Software134 License along with this library; if not, write to the Free Software
135 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA135 if not, see <http://www.gnu.org/licenses/>.
136136
137On Debian systems, the complete text of the GNU Lesser General137On Debian systems, the complete text of the GNU Lesser General
138Public License can be found in `/usr/share/common-licenses/LGPL'.138Public License can be found in `/usr/share/common-licenses/LGPL'.
@@ -152,9 +152,9 @@
152 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the152 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
153 GNU General Public License for more details.153 GNU General Public License for more details.
154 154
155 You should have received a copy of the GNU General Public License155 You should have received a copy of the GNU Lesser General Public
156 along with this font; if not, write to the Free Software156 License along with this library; if not, write to the Free Software
157 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.157 if not, see <http://www.gnu.org/licenses/>.
158 158
159 As a special exception, if you create a document which uses159 As a special exception, if you create a document which uses
160 this font, and embed this font or unaltered portions of this font into160 this font, and embed this font or unaltered portions of this font into
161161
=== modified file 'debian/rules'
--- debian/rules 2011-04-16 13:00:22 +0000
+++ debian/rules 2013-04-14 00:52:26 +0000
@@ -11,6 +11,8 @@
1111
12include /usr/share/python/python.mk12include /usr/share/python/python.mk
1313
14build-arch: build
15build-indep: build
14build: build-stamp16build: build-stamp
15build-stamp: $(PYVERS:%=build-python%) $(PYVERS:%=dbg-build-python%)17build-stamp: $(PYVERS:%=build-python%) $(PYVERS:%=dbg-build-python%)
16 touch $@18 touch $@
@@ -142,6 +144,10 @@
142 rm -rf debian/python-reportlab-accel-dbg/usr/share/doc/python-reportlab-accel-dbg144 rm -rf debian/python-reportlab-accel-dbg/usr/share/doc/python-reportlab-accel-dbg
143 ln -s python-reportlab-accel debian/python-reportlab-accel-dbg/usr/share/doc/python-reportlab-accel-dbg145 ln -s python-reportlab-accel debian/python-reportlab-accel-dbg/usr/share/doc/python-reportlab-accel-dbg
144146
147 rm -f debian/python-reportlab/usr/share/doc/python-reportlab-doc/html/_static/underscore.js
148 dh_link -ppython-reportlab \
149 /usr/share/javascript/underscore/underscore.js \
150 /usr/share/doc/python-reportlab-doc/html/_static/underscore.js
145 dh_compress -a -X.py -X.pdf -Xodyssey.txt -X.xml151 dh_compress -a -X.py -X.pdf -Xodyssey.txt -X.xml
146 dh_fixperms -a152 dh_fixperms -a
147 dh_python2 -a153 dh_python2 -a
148154
=== modified file 'demos/colors/colortest.py'
--- demos/colors/colortest.py 2008-10-19 23:16:31 +0000
+++ demos/colors/colortest.py 2013-04-14 00:52:26 +0000
@@ -1,6 +1,6 @@
1#Copyright ReportLab Europe Ltd. 2000-20081#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3__version__='''$Id: colortest.py 3269 2008-09-03 17:22:41Z rgbecker $'''3__version__='''$Id: colortest.py 3959 2012-09-27 14:39:39Z robin $'''
4import reportlab.pdfgen.canvas4import reportlab.pdfgen.canvas
5from reportlab.lib import colors5from reportlab.lib import colors
6from reportlab.lib.units import inch6from reportlab.lib.units import inch
77
=== modified file 'demos/gadflypaper/gfe.py'
--- demos/gadflypaper/gfe.py 2008-10-19 23:16:31 +0000
+++ demos/gadflypaper/gfe.py 2013-04-14 00:52:26 +0000
@@ -1,7 +1,7 @@
1#Copyright ReportLab Europe Ltd. 2000-20081#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3__doc__=''3__doc__=''
4__version__=''' $Id: gfe.py 3269 2008-09-03 17:22:41Z rgbecker $ '''4__version__=''' $Id: gfe.py 3959 2012-09-27 14:39:39Z robin $ '''
55
6#REPORTLAB_TEST_SCRIPT6#REPORTLAB_TEST_SCRIPT
7import sys7import sys
88
=== modified file 'demos/odyssey/dodyssey.py'
--- demos/odyssey/dodyssey.py 2010-12-06 12:45:44 +0000
+++ demos/odyssey/dodyssey.py 2013-04-14 00:52:26 +0000
@@ -1,6 +1,6 @@
1#Copyright ReportLab Europe Ltd. 2000-20081#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3__version__=''' $Id: dodyssey.py 3660 2010-02-08 18:17:33Z damian $ '''3__version__=''' $Id: dodyssey.py 3959 2012-09-27 14:39:39Z robin $ '''
4__doc__=''4__doc__=''
55
6#REPORTLAB_TEST_SCRIPT6#REPORTLAB_TEST_SCRIPT
77
=== modified file 'demos/odyssey/fodyssey.py'
--- demos/odyssey/fodyssey.py 2010-12-06 12:45:44 +0000
+++ demos/odyssey/fodyssey.py 2013-04-14 00:52:26 +0000
@@ -1,6 +1,6 @@
1#Copyright ReportLab Europe Ltd. 2000-20081#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3__version__=''' $Id: fodyssey.py 3660 2010-02-08 18:17:33Z damian $ '''3__version__=''' $Id: fodyssey.py 3959 2012-09-27 14:39:39Z robin $ '''
4__doc__=''4__doc__=''
55
6#REPORTLAB_TEST_SCRIPT6#REPORTLAB_TEST_SCRIPT
77
=== modified file 'demos/odyssey/odyssey.py'
--- demos/odyssey/odyssey.py 2008-10-19 23:16:31 +0000
+++ demos/odyssey/odyssey.py 2013-04-14 00:52:26 +0000
@@ -1,6 +1,6 @@
1#Copyright ReportLab Europe Ltd. 2000-20081#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3__version__=''' $Id: odyssey.py 3271 2008-09-04 12:45:58Z rgbecker $ '''3__version__=''' $Id: odyssey.py 3959 2012-09-27 14:39:39Z robin $ '''
4___doc__=''4___doc__=''
5#odyssey.py5#odyssey.py
6#6#
77
=== modified file 'demos/stdfonts/stdfonts.py'
--- demos/stdfonts/stdfonts.py 2008-10-19 23:16:31 +0000
+++ demos/stdfonts/stdfonts.py 2013-04-14 00:52:26 +0000
@@ -1,4 +1,4 @@
1#Copyright ReportLab Europe Ltd. 2000-20081#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3__doc__="""3__doc__="""
4This generates tables showing the 14 standard fonts in both4This generates tables showing the 14 standard fonts in both
@@ -9,7 +9,7 @@
99
10usage: standardfonts.py [dec|hex|oct]10usage: standardfonts.py [dec|hex|oct]
11"""11"""
12__version__=''' $Id: stdfonts.py 3269 2008-09-03 17:22:41Z rgbecker $ '''12__version__=''' $Id: stdfonts.py 3959 2012-09-27 14:39:39Z robin $ '''
13import sys13import sys
14from reportlab.pdfbase import pdfmetrics14from reportlab.pdfbase import pdfmetrics
15from reportlab.pdfgen import canvas15from reportlab.pdfgen import canvas
1616
=== modified file 'demos/tests/testdemos.py'
--- demos/tests/testdemos.py 2008-10-19 23:16:31 +0000
+++ demos/tests/testdemos.py 2013-04-14 00:52:26 +0000
@@ -1,8 +1,8 @@
1#!/bin/env python1#!/bin/env python
2#Copyright ReportLab Europe Ltd. 2000-20082#Copyright ReportLab Europe Ltd. 2000-2012
3#see license.txt for license details3#see license.txt for license details
4__doc__='Test all demos'4__doc__='Test all demos'
5__version__=''' $Id: testdemos.py 3269 2008-09-03 17:22:41Z rgbecker $ '''5__version__=''' $Id: testdemos.py 3959 2012-09-27 14:39:39Z robin $ '''
6_globals=globals().copy()6_globals=globals().copy()
7import os, sys7import os, sys
8from reportlab import pdfgen8from reportlab import pdfgen
99
=== modified file 'docs/reference/genreference.py'
--- docs/reference/genreference.py 2009-02-22 14:19:44 +0000
+++ docs/reference/genreference.py 2013-04-14 00:52:26 +0000
@@ -1,8 +1,8 @@
1#!/bin/env python1#!/bin/env python
2#Copyright ReportLab Europe Ltd. 2000-20042#Copyright ReportLab Europe Ltd. 2000-2012
3#see license.txt for license details3#see license.txt for license details
4#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/reference/genreference.py4#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/reference/genreference.py
5__version__=''' $Id: genreference.py 3376 2009-01-19 12:05:41Z jonas $ '''5__version__=''' $Id: genreference.py 3959 2012-09-27 14:39:39Z robin $ '''
6__doc__ = """6__doc__ = """
7This module contains the script for building the reference.7This module contains the script for building the reference.
8"""8"""
99
=== modified file 'docs/reference/reportlab-reference.pdf'
--- docs/reference/reportlab-reference.pdf 2010-12-06 12:45:44 +0000
+++ docs/reference/reportlab-reference.pdf 2013-04-14 00:52:26 +0000
@@ -1231,7 +1231,7 @@
1231% 'R71': class PDFInfo 1231% 'R71': class PDFInfo
123271 0 obj123271 0 obj
1233<< /Author (\(anonymous\))1233<< /Author (\(anonymous\))
1234 /CreationDate (D:20101206144432+00'00')1234 /CreationDate (D:20130131201657+00'00')
1235 /Creator (\(unspecified\))1235 /Creator (\(unspecified\))
1236 /Keywords ()1236 /Keywords ()
1237 /Producer (ReportLab PDF Library - www.reportlab.com)1237 /Producer (ReportLab PDF Library - www.reportlab.com)
@@ -1440,7 +1440,7 @@
1440endobj1440endobj
1441% 'Outline.49.7': class OutlineEntryObject 1441% 'Outline.49.7': class OutlineEntryObject
144294 0 obj144294 0 obj
1443<< /Dest [ 44 0 R1443<< /Dest [ 45 0 R
1444 /Fit ]1444 /Fit ]
1445 /Next 95 0 R1445 /Next 95 0 R
1446 /Parent 86 0 R1446 /Parent 86 0 R
@@ -1458,7 +1458,7 @@
1458endobj1458endobj
1459% 'Outline.49.9': class OutlineEntryObject 1459% 'Outline.49.9': class OutlineEntryObject
146096 0 obj146096 0 obj
1461<< /Dest [ 45 0 R1461<< /Dest [ 46 0 R
1462 /Fit ]1462 /Fit ]
1463 /Next 97 0 R1463 /Next 97 0 R
1464 /Parent 86 0 R1464 /Parent 86 0 R
@@ -1467,7 +1467,7 @@
1467endobj1467endobj
1468% 'Outline.49.10': class OutlineEntryObject 1468% 'Outline.49.10': class OutlineEntryObject
146997 0 obj146997 0 obj
1470<< /Dest [ 46 0 R1470<< /Dest [ 47 0 R
1471 /Fit ]1471 /Fit ]
1472 /Next 98 0 R1472 /Next 98 0 R
1473 /Parent 86 0 R1473 /Parent 86 0 R
@@ -1476,7 +1476,7 @@
1476endobj1476endobj
1477% 'Outline.49.11': class OutlineEntryObject 1477% 'Outline.49.11': class OutlineEntryObject
147898 0 obj147898 0 obj
1479<< /Dest [ 46 0 R1479<< /Dest [ 47 0 R
1480 /Fit ]1480 /Fit ]
1481 /Next 99 0 R1481 /Next 99 0 R
1482 /Parent 86 0 R1482 /Parent 86 0 R
@@ -1485,7 +1485,7 @@
1485endobj1485endobj
1486% 'Outline.49.12': class OutlineEntryObject 1486% 'Outline.49.12': class OutlineEntryObject
148799 0 obj148799 0 obj
1488<< /Dest [ 47 0 R1488<< /Dest [ 48 0 R
1489 /Fit ]1489 /Fit ]
1490 /Next 100 0 R1490 /Next 100 0 R
1491 /Parent 86 0 R1491 /Parent 86 0 R
@@ -1512,7 +1512,7 @@
1512endobj1512endobj
1513% 'Outline.49.15': class OutlineEntryObject 1513% 'Outline.49.15': class OutlineEntryObject
1514102 0 obj1514102 0 obj
1515<< /Dest [ 48 0 R1515<< /Dest [ 49 0 R
1516 /Fit ]1516 /Fit ]
1517 /Next 103 0 R1517 /Next 103 0 R
1518 /Parent 86 0 R1518 /Parent 86 0 R
@@ -1521,7 +1521,7 @@
1521endobj1521endobj
1522% 'Outline.49.16': class OutlineEntryObject 1522% 'Outline.49.16': class OutlineEntryObject
1523103 0 obj1523103 0 obj
1524<< /Dest [ 53 0 R1524<< /Dest [ 54 0 R
1525 /Fit ]1525 /Fit ]
1526 /Next 104 0 R1526 /Next 104 0 R
1527 /Parent 86 0 R1527 /Parent 86 0 R
@@ -1548,7 +1548,7 @@
1548endobj1548endobj
1549% 'Outline.49.19': class OutlineEntryObject 1549% 'Outline.49.19': class OutlineEntryObject
1550106 0 obj1550106 0 obj
1551<< /Dest [ 55 0 R1551<< /Dest [ 56 0 R
1552 /Fit ]1552 /Fit ]
1553 /Next 107 0 R1553 /Next 107 0 R
1554 /Parent 86 0 R1554 /Parent 86 0 R
@@ -1575,7 +1575,7 @@
1575endobj1575endobj
1576% 'Outline.49.22': class OutlineEntryObject 1576% 'Outline.49.22': class OutlineEntryObject
1577109 0 obj1577109 0 obj
1578<< /Dest [ 56 0 R1578<< /Dest [ 57 0 R
1579 /Fit ]1579 /Fit ]
1580 /Next 110 0 R1580 /Next 110 0 R
1581 /Parent 86 0 R1581 /Parent 86 0 R
@@ -1722,9 +1722,9 @@
1722% page stream1722% page stream
1723<< /Filter [ /ASCII85Decode1723<< /Filter [ /ASCII85Decode
1724 /FlateDecode ]1724 /FlateDecode ]
1725 /Length 1186 >>1725 /Length 1176 >>
1726stream1726stream
1727Gau0Bhf%7-&:P.Os5Dh7%%4/gQFoDhfX_5ZJLo?u4lh;0:Gs#He4;'gpXek)>BZRWF0K,X@+aHdhKRk*G>nVuI?O*Up&OPrGl9gW,_`g^,bO0p?c,\4q:T-<B?:on<feu?=]I%'H6t2^@EC(HcY.rA[q>ke:]$uML&LSpn!;##,g.Z@XuSnZ3,%?T=T`S\Y2C'W1oOTjJGN'?^Ottcd%8<siHdg<.pbOiTBIPcVj"!L:/]*<H'V3QY*:`2O0'(!m784+Nj=IJ`$3m_a<6=lb(3#]YCm(jg^8ZJAs*3VD8P,B<)PQ-RIq!F8dWDf8C9aSRC-]]Tc7!>Dh0>I4h?p@o\8^hNOWlH*gK)&.uH'N(60],Q/@bW#AkLF/u5^Ib2I!rdqqPt*O*rUSiP1R.G)oah$<^CPkf^B3[<.;6rJQ:?#;@2gh,c6h'G$P0S=\jga`bnX#1.f,7+JTOjJiWq>:=(Y7oN$eLLl&l[*kAZh?BAeu-J9b*RpJ5-)qf6tR$qFr1k[[$:ELZ@kLOjm3L*UM#@ApdIk3q,ELS+R6o7pd0'=Ktt_0abf]&MZE7RT,"0CO4iX;@8@%?D?X2eO?hUe0e/4'[b@C`1:6+\6$K8\K+SX<l_fAg4a!sHcq!C%jk'l.32,3q%'j(_jl&cm"?S`o7dT!8;lIDHc3(KuKV:9'%OsqC5&$+#;>s4FdeWoCU@d251m*-n7&WF\W#HUnZ)%*)Mafd_%fRE,^:OXXj6$H&#[K"=m&OSL=J'q7R5[9oS>2pXA,AH5BH>(%Uab9>;p1:@7`oY@CChDZmnn?Ch<7<pgdRq^it-uX%G^/Un0G\%2OnCKDX@PSfO2ki+q9^;2l7guh0<<V*iL;4<l<Yg%0s%g@q^mI>jp\_]Ais/CW,/tBh-CJQ]-l>G?j5qr,OSKL^[M9).D6aE7k#g:BiB0s$!4C0Xq#.,O+D0[c.2KT!\5<"?#l^)F*HQfPFF9&)\S.D_&F?Db$ZC?"oR@aAgY.Gn*8'&!UG9Vh+f%DJ!UNa).!D2G:YN<YV'J78/_M"gUR^G4;7:gP+7H_`W;t"XU.9`m@)8B!bbs%t>mQ4HRFTin1:DI6]D%r1^1O?a;iu=5cRqb2A#rT#R!>1Yh9/OhZ@>%%S,]&q)!emp@rd7aAo=N39Q4(ju7G/0MM!q%A/VoneQFIeF;:J!@D~>endstream1727Gau0B9lJcU&A9%PJ!aI(_I`Kk;TU@RRb"DV,S#anTZ`K<8m@Lkm-`:3qs->U&uisW,,7G4_QYnY4)`ugR8jLnrIjT_eH*<8i;)+=_?c#'_Sf6C\;"@Jo<Z3Xcb^\\b9:$.I\&36HH1^@(K0Sj1HHYKcci*Hke%11G?tp7duqKWj#ErU;1j(F]i=-_Q14);(#32L$:TXb;#CL9:[mrVg(O5>Sd0AsoI4mFM,'FB3`0GPKN[4dib7=m-&e#[:`1n)9]?V)PXY'e(?(9C$t8'nFu6j@__oeN2X$r5P8)A7jZ_KneacTm2>ZgBD4r&oQ<-nj9P`.Ecj[drf>'c`*L_thl#/FplIE0Y3YVd6fME'-$61QIc@2Rn5GU1[)csnj."blc/[l^ECOcj`G0KH5[I"6ZP+@5$7%(.^Zr()08L+>XWm/!3b?]h1fX\dh![!:/1X@o5DarXh"qh2f+s@\4Zh6Bu<i9,q(=*Dr;Vo82WmTgb),H0SAks!dH;pC./M`;.Ud8($,MQ8U;jG^&/rY7!14+C.LgT6hP><2j%^Jh<NsE=_k7SjAKI>c[$O<oC*u-%qNnNO:?q1[dAckpRO?g5(@h:LI>tKb$b#"583IO4GlkR9F<^5goltC]LFE99"BT3H;K]D(RClgYJb/8jOE-AahK@m;c;l["\`WC<4\=sg_#6c>"T/9*GbeDQ#B^pS[./NHL:#m@4&IR,,RRRK=?dj8%]Km'GK)\+_<u4V?r6hA"DMm28qlV>heuu3QbaP,,?DFBkA,A8EW"%juUb-$1>O-hh7`oZ,.hPB"Dc'ULc!U`BX?>@$EJQtB6EOeU>E[PS>>@Ap*c45I)bfHU;r=m#CH@(4XU!GTN[Bp0Q)qRQEi>gU%.+XblYPF,^+MZPMYBT4G/PSSb0#P'lRHo6BA8\;AD!@=#ZY`O_9,f,11;+!pDm8D]kssEQEHg.Qenn58UK2Y&49NnZAW$"jUS-S!d8V<Z-p8WG%@Z$'BSbM9MVpV,`lUG8,;sb>1fHYksnkh<+3kJ3,4b!RauVF#36Ve,$X2,")jtsc@([4XMa05OHGu/!$.k49W+]ppMUE]&#?G.+L#TWohnY<!e-?_orj2oiq*'ZIO"SNrYD'8_=Be[Y&(B"J(+0.\Std$]9\%VnF9GeK]LsmQgj2,%n)*BZ[W!o=Hs^~>endstream
1728endobj1728endobj
1729% 'R120': class PDFStream 1729% 'R120': class PDFStream
1730120 0 obj1730120 0 obj
@@ -1749,81 +1749,81 @@
1749% page stream1749% page stream
1750<< /Filter [ /ASCII85Decode1750<< /Filter [ /ASCII85Decode
1751 /FlateDecode ]1751 /FlateDecode ]
1752 /Length 2140 >>1752 /Length 2127 >>
1753stream1753stream
1754Gau0DgMYb8&:HLqJ!^Eg@Q-%o;N`?<8HJ!`+DmRY[aOfa5d2G6d`*Q!h-F2^d#[X`V5T;`a-S,./5aT]fe^)n6\X%.?g-D-N9FiFp.n!^,O,dgC^4hB^S<admB(lH\&.stDNEN!@F4E_p)p]Tp#E$66Z"U;S4l\3&_gMa^X\:O\"KskCE65%3ae3j%d?lPcfbNq5%<^"<+JEIO,eC_s-`^J&c_;2;&kB;q4i&2b2o,JRG#R)PG'b_Od31M3e,SN-hGONai/-LJ"*OVVbYC2BP9b\L(0#=D.W8^]N`EA-aU@"`3OS[,gm!aL:*+-1:jYkZk//`-Pl#1:.r4+Y]W0p_pZ'"1h<CQ<'I=9mu%rYd!>2ai_hf$+jm7do:SXW`[,q9>bXa/-2KiGM)ODR<K(H@NBeeQY*;b_oqeKa?/AC`Zq"oN[#0P9h4rN!>ee=.?XNEJF-ka0-b?Hnl'32uY*m#4@uo1smf).:h#RFo5l@eZg.?<piUA10:fUhbZL`/HD@r<$P%'R&k;"Q$BQQ_C]TO^daQ`M3M[$#Q>e:.l^TYU<3_-F'3hZ&4Ef%kI\M3kP-'CZbZ6,mQP52-X]OFMYNC?J3,c?Qk2Kf-8,8O<dlioj.Q78.m^9_oVXOEE[?uVHQk&1=^_GKY>Ir;V'FHqK6[Z2\SS)Ca&=`56!T0s.q2016:nspW=oO>k`FP*5f$h)9?6.X:Yq;T*5-!q&?k19bH=&].\@e])eW*>%4615BpYD.J-gAro53dlF^!)69l,Q9`e?70E8(]S48c=<UVpI](daHP>=EV1(GdT1?>0sQ2`>uA62E0,$?(u6qfA-8WMWfY7F,t;W4dOJZO&i_L"RCcjZhtZkA\a^;[ZU)_WnWD$dlRQ[]1lrrIF*WigqB-nT;!6NXCHTD9adO]d)Q8Hb@rO>l;.r0->]kg(e6&4l5nrWtU?FdA9S0_V-o[Ba]%L[?D4*Eh^#G)@(/S^:kB*6XJUD3H$u,c\*UR-J'XbL_<`]"V'EBnF.P;TN_q2<HR<0p2Z^=l,"J;U3;[PN0Ap&FP?j#V4D"I^.["B]#!"m=eToE9q$X:P9*Ae:,.[c(>..Z\Gmqmj=,6]](*_VcpFB7(?JAZC=Vp7g-QM</gMUdGZ\C*oEnqLKGc,c:,-M4"I)Y=fNq,7i/XsYJ!BVo0.9W2>gYd1%PqHH0<:%h`e6u8kDQ9"hY0Vat\5ed\:a%XR1pg7];g'"Yjb"GJIEmjf]S\lW>j>7P4P.I4HVH;*?oUA&[a`%5:T8J=aK4=!''DW*/`@\YHpoX,e6pp4Hm`$oBcdn<D9#]^YG..*=Y@L(RSm(@c;+STUIp.VX-=[dODod3a\1tdO.XeG#_ZFq"<m?3FOgelEJl@<.=l%IjU/hsrhjsgB>k?c.Cs5`/e#5!Zjpg?1+#.],6;Zl!%\%\4?hh_*UL*DTL@NuR$!.J<-nq;^j"6@Kkkk](F!FcUS.(P$:?3W6;IrF2a<Eh)+EfRkZSi:G(`CFM7Q=leC>o\f\b3Xd/"5#BF]B0%1`*Np7Un'9B@DcEY>42anPp7gP(UH'E@APk-nCXph&f:+Y[^t9$&un=6[q:Z]_j=.5)\!Kr=oS>As[C!l_l(#-+YNAg)7C#TRN(/$l8O0]DH9tbCbbr1._4t#J6&C=93(G2?R?EA@8Q[%P*u@L7"h?9JongY49*>oOL(2<M]&:[D?5V$F/o)@2l)JOZ%/W`oA1R4Wcnd@YD%Uf2M?20^1>MYST<,b#E>5(Pi!i1-/;#MhMJ1-;/d_2n9PX_C>$Q_qDXH)EV"?mI*gtP5m<QT*6&YgE4KiaR:g56,.f\\AI\iSb`82!_mfojWXfAUj=60PRGZAc1hW.^h_JNk.f..25'V).<H(A4E:"2q*?3eE@Qq>dAT/)aG9n&BBQCcj,_2)]K*\^B$3k0hUp(?^/U\"]p*I382K3N)a*$<Z,DWg3mQ-#8Jh:eLYT,4.Xm8m-@O#7!B&"W#*@K#.5l?(7bURTq;6@!'K5o.4&Pt"cAFit&U!D*(I$M4P>',d:[.ZH/K3tP_@<bT<P9U4DK^YMVfT)F_g!3$(^*i!Ja*JoLbF=!<DQpA*`dk1FeVnJFhP*V>"[sna$m[b&0;td*?W';*i5iac"u+jq@D`qM5(~>endstream1754Gau0DgMYb8&:HLqJ!_-&Cc=+";HGs%KA.Y:J2DCY[s9\>XN6[61!+!MQ^.pLj*PAel=0SG7#!"&\MJTpG%R\7g@u'SH^k]HG!WmW$Rq%u@SC2hkgIETH@)p/o5/\!>jNI>W>ci_h;Rl81:oV4T,BZ?-54\Hj@gDq]@6IXc")#'$6-NNT/oiA<G"4$5XR_F(_$4rK=>oa'ra;U3M_S:FR]b/rrE_NJOkqg9:)Y`^<N4J/e@Zqb#h/7`_PcGY=3erbAcq@Y`Z[n<oHt)j[qA:+[3dZ`Mp:$Go])MA#,<'+WI]Q_\.fJ6D\*8jH#6@.i'_UU;r,03fhb<Xt8p%%ct2WDCQ)5.2%nA)WA`2720j8I':'0:3oMhCB$CFP3[+ESemaWfl;lJ:L'X]\9J`%R7ec$M54o5P\PVX.90HY<#6S&7PV"iTmr,:4XrDZZ/7Llr:7_$GM\0ol</Do(7?,=DsTHXc&@!3p_UDiIi]09l_AWdgf-8GaTb_8Q_`sl*J6FA.U>q'Er&sO"c\Me.$`C>V&hY1\EqS@FHgRM`9$`9GXq3*G$5,M?;iHgGq9b$?`QSX85o571tOKipRbN'Bqhk'M4WgNH-jN*?t.'kb0.\QB[&<o;TX,`cA?\4nehl(8lkp<5V<N-^@BfUlTeP95IGX@M;&0BNS\:%i:nR<9W4@80p*Qr8>_^Y<i4mm'j165AhC<k9',B"3gY4GN*BO'3*a`,Qcm:1HVo!IO+ZCI)I<OC7^iJ)&p3j0h%DP1@>"?(,f<s8rZV9iet'iN(%-::AKjng5K<@tpe+i1[D^"0^Up6.i9;BCXt[Fs3ljc]lVo$g77rNgHDG]#8gJ@\AhnSH(;KD*ZZ=M0pi_R[6fK>YOk/.4<&BaOQ#h54*r@'&9i1$+b7,NNf5*eh=q+HLV(jqKb:'`a"BR`/(:BGU9+]))R4,Ym23ZrM!Qm!*W,B&s86_sO6*L)/OTe]fdQ*jFH6i5:9gK6HXcoM!NM9;E\!8g73<t(.U5DTug%'9&FXE[%i%/IU"Ms9#nWZAcLoO#W)f,O<NK#!qMJge\#p:EP0=5`bG[ZM4We9H=8gX'_)F]+=m_/!AI%nDfX(/-;PWmW@p2O1Eimdc,h\%#C>I3$c$<J,P9&@u(^DRo1gOqa)=Gu$'2W"bEja'C*KOtRG`.SJ0"=lP`XhXNBe)U[JT8@Emj"b8>N@Od!O6@*_m$%eo&cW(f9:I'T6$^Eu6V^hBZu\4fK:HSk>g]4rhY-6FP^`4j+rQGlk"Dt$B2DPk5*=a\=ko`EK&:>CcSUmCk\g;2H*s&.f.$thZEprWH6k'SZu;ck6m3!EI_Q0ic))t^hNIIMEFXM(<Vf0fLBZo$XBGU<,&bSh"fDQ;Z[/9q7%G`^^-;Xe\Db&FfW%d$o;GYXMhZ5?:RF(;+Xm!7a6eZW00B`:`IH8XLi+NS2b)$$;Lh2e!@8Y&JODoh8'%&:\UkW.LdZD1T:h9\956h[naQggUJ[G=EH&b48<,FA)/E%^DlCotmKHkCXO_9hWl_$LUa7mdEiH^=?QON9.Z]RmRTPmrlm%HVn^U<9\]X;tWPf!&eRb2r<*V6O=7aMV=5g20\j%LX62q1cK^T9:TW(MA>\'dj<6qA.F#s)sMQ`,T]N1(.r_)p_Yp'S]c[(W>G4-8!&fIUa80<\c027BR:n`'[?oUuU9B".cI%IGAEOrQI7oQBL$[=,XW_h0]9=B'p`A$\V.imed)5IXh$:,W9a9@%d^a=KKXG4sYbQ(1MaV5]+*.Cqf[2=/e+e3l"&:\!7$K".9ddWNZ_5Q/+3INU$ejZgmdnBt;G-Va^Ln3`sWJWFW<[a9=KU6.u^uXrs@1G;uf`^C5Z'!p9[;bShj)0oq48JuQY#!4siMLa$5*TN/@qMH$s/@Gj*;"0oYYPlp2!8a1`WUmm#"V:G^4LG<-H9VFE7$H=K1H(+>'j`:+*m!^o+Nt?-Eaa5SBI@L2P_`Qlb/8?(oQnsZ#-99WN$%Jqk'm_k(fro.g?Te?d.mk"jjg#@,.X.ZhKh'(6Ms*]dDQP%t[*NfAG(d]T,sM!jl;sCSPs1$5$Vg=4['*p#0=2Qr,O%"OY"8>HFZC^2[C7lipl?!UKOnpjetFW-cEug>2Q8)EGB"~>endstream
1755endobj1755endobj
1756% 'R123': class PDFStream 1756% 'R123': class PDFStream
1757123 0 obj1757123 0 obj
1758% page stream1758% page stream
1759<< /Filter [ /ASCII85Decode1759<< /Filter [ /ASCII85Decode
1760 /FlateDecode ]1760 /FlateDecode ]
1761 /Length 2191 >>1761 /Length 2177 >>
1762stream1762stream
1763Gau0DCN%tI')c^`s']<n_FbrWU)oU?+Lm6T"t<BEDCPeVKn5-s3KghJ\BOBhZL[=.Ak>jA@U$:f8s&i%SXDVsF(U^mp$dsYJ$L90SC.r:@uC.?SPqY0L,Aj_I[V<"I5sKKl`oIVN<eKW34YDacLK;3Xt7nY>q,5&]i%lO+8*KI]/W!+_!SeN3Q2Yo\:T_q9glrGRYZ^DXRq_r:EmhJ7+3H;F'@l\$Vsad%92OZA_DfM9Q"Rq3U*(3P$cW/0:KVP:25r4`OR?.\14&9OaL5@3mf#??n#=*'2GNK3aY]uhMW;..F`rT,KMO'a651Q[O`>K2:;-&+S+92T_/-/q+F$<OWYd&N:%oWpnU$-r<o0'.DNO`36p[<YMMBU`;)hTlMm'>q8C"S\KaOabAIWRr0#:j02=Y-,_k7q0Ie(sonHAFed[Ln=VVh3d9J=sbcVsjbm(a')7/HPbKSZDQj[]B8PI]kJGmhH>&0s95J@r9^K*[Cm_"-9T*AjhH?m"acSJM6o9Et"FSE5qV9RcO?6>0dBQAWa/u%rM\]D[cSVsAWX.?/3EGe=D.:pXSR+09C3C]E^OFbNg1PaF"p*-ZVrol:l+aX.ijBje!#4ECJj*0+q&\kpYNqhE>E?+E>!n-b'9\Gm0N>!psBp=kUQGH`qP);+h9+-0k3@-$Hemq_s%?-o;X`jcYmK_(*S!C9<+,n`W@>r@;5i2"-Mfd0.YIFGMme"gX]mbC9hM:1UiW.tb*6E>6,K-1h#;iQe\[O&4PuMVkDR1#cdZ0X<Jt==Qd<PT[]K6,EG;Em;ddoVH]d^OWn_=LDbdDqIqT#6.4+/HknR84W)EbkRQT@o.(Cc>TSWo\sH%>YcQ10#;IOU80HDk"D,EA=\i=4q?O2ahp`'Ba'BoNio_(F&)5p<lVEWgbi#`[FCJYt!(L06R1.SHp@$,a^SP3Z9[_4Y*H;X6[F^d(1%Bni'c[i36VlW9'.Kk4=CaYUL/]uUX6+I-kg+U1["4KDu:U#TN#DKq/b0YY-SLh*,CQrQB\-LlI9bE8OL#&n!NZ.+UT'J%LP)+:IArRD8+l<WEnLmZu^=Vc;n^i^lMMC\##2a0S/,g0RXW<0@4X!*t>k7sDte]:]<4ImD._;LF)3:CdtL-<Xu-%9O(6Xq0#plYJ6H*@1g^4@H$5+8#9%7L%UCY[-YoU4#DMBH.f:\e'jMqg++*tQ<M_hb`c*(Tr4M-qh2R92r>\2GKm6i_!jn<+ElM_4SPTqSnpldo+LWo1_>`0oYI[nZXOM<H1GTpY*.QL+nUc<6;u909X8PQm163,<i,=>NmiPp.[e8J?Wn$tqp+c3APgREfU>2>YS^"/LNoG^dP8"Cm-q:0k2*&P8!GfPofL.[2BkRuKldlnBClE'kd72dq=?0QQ:ik+l7$Sk@S&qn&&&Bf)asgiSDZT5G!"]oNOfSigm`<i6\_i=?B:UD0%60j-QJ2tuI+&IM.LJI(sa*G5m,$i\8k/8GD6QLU6B$%sO6fWZau8_=K1APaSAAuon);61bmJ1B[iSb0MgSl@e[#2RF'^pem%2>cEF7.4"Uj??Qr"d-'q_*:AE/34A9:ZP"6e4&7G=Pu4bi$+Yt&>Od+#nO4:i6;&pi?&+ZBAl'0`hoG]huYF3k&bT:&]]Ire!@6m!R`&DiH#2!fs^n0;SuL-m#m&U=op2`[G:5iI]=YmKN+(.D1%^QbPc%afEp'(W9UpJFGk18njURm'O5jrPZ%!FrWYGl>%:$)'ZPGQK_Ca<d=:s8"C\h1\WL6]J8?Hr&1]3pYj6gjEX$e'7kstH9j&B&^&RNcn&(qZqDZ!k7,&u&9$Z8m'1OG.<!S>+73:7RgK7Xa/DIpNMhcqODeC,0EFk=B\qQ8c,]#f)E<r$!:1\1E'J2c(,cOb0N\$b+a.f8"PRBUj=f)SIq]P<&?J[p7LD[%80.+9+jPg/Qj2"%MOrf0TX:e]?!ua0,eDQlF9t6Q]=WO.7ZhU>dIFa@soW!3&<'qte[L\ZqBZOLne)RZK9R-t1(@7l+7*,Y^LONFQ;8%!ABC&i8N'[lKrnasM@W4SP0>&.gDdNm\FH?;U^::+>)&@<XYn5&2C.@ZpIKmX?&@=m8Ae20.*KN\QpLVu",?(qI8EUAcXdifYE!*+YbK29roim[rNV\:+57YQqHPud2:L/H*N8ep3>(us`,Q0'N^0*?7+8lZ>/*\_~>endstream1763Gau0DIrF("&H+gY^;D,0&@ZU8s0bk!(`I3Z#8CIp)FZ^j(hi/MZ^+%FUuJnVId\[f[[T*KJi/*29BI6:+7J&,h51tegYk;%&m^I\f@OkSGA'+8Ft`..pauG!5!JghI+5==%S&ABpS6='Hj#r!UL,W*:Q8X0ml@pX<ZN9i_GE<U5(^\3?$AQ]LrN*30Vjh)0Tu=Be:9D*b*ATgaVTtcFSYh"9AKI\mRV!9X"<CG2#]i%k5iod[ik?I;<P3G=uE&R4sIjN_Gcom9P7kLnQ-1?l*O#@03_.S^MI1=HZ;9?p)k89JYD[KE$n*CfbZPfTP8/oc,g&$<GW8,[s&ZuR0q!V#%,7e;Fs3SZ83i81e!-rAf?'4p]GU4\E.&PQ/(93``>/>r<19XBsonVD:"9o9a=b4DS!@;Fjn79GA%csUZ)4jV\]@P`J)!;>%s%7QnqH2@;2UB3MY5;hO9[LUVZL!d"\*`&[02*QHCi:(otCPN(Q#s/pQ1tbGk%tqJ#isF-E1[?`X_mfcN\ss,Y9%A0]$acj)H\B:cb9R4GscP;V[&@$#OgY87o/O0dG`I,7#;elNMtd_bSs^#%gE8pT\j,c9;14T4pJT@8Q-g`J^S;Z#8l.)ptd'$*L9j&I=4kB.R(]m9meHh?Jn`50?#9/Y_]Bc15uhKWZqe7+Gh@_CP8.tW@C1*;2VZ"kLQTNA\FGVpZ><(0t@9*8('alP!a5[;ReEYo#$OBup)c'=_4"q%t51Rm?E25;;/H<0oA=E\MHH-2`-2<e7UJ:LV-hM)kZ$D5csem,:S`aut:A;9X9j4YgV(s]2aCOj@PW@UPseh2M0X7Ef]*MHS\(/Yi`f&6@E$+.:pK8)'h18cKK#<,;`d+O@_;6@Og1B]s*&)^%@n<I2ehkWCga^eV,Y?8;!21"G\Vkh>*,@/(eP2fI6@4*(1G]`,@jN#AXm8"3$$jlUPA:/&5ddKK^-H:D=I*b[miV[,JIl!A5"60mU5c=K9U$_K,;<L[t(lNj_Q4Z,p<tOd4J/'8Q:9iNmeqB1$;oY1m/F'6:(-Lq>EU#OED&n)A&:F[:'UFc^frhU;),$.NP1536i%#)YMI+9Q9U+F+&XA$F$,j[^1Lu`V6!dKiZO4Ei;96*470Rl0I_hNZYbEkMY$S-<,f^s@3-/XG8sS.7UJWM,/7$\%XXPOZRPNpNRo%+p!)CBkB8L0$ai$J^)paLuPX1d6&`MbmcDUQP+QUZ)Z".uT8fcd8!8!FoFtJfPPC'QIHU]D3V$8-rbB9?2aXm'3/(/Me(pT$<CeYH\&]7d8ThhD#==cfPkqlso]c4r5@2i%^S=u-I'E9G9Ji);h>OE7$XXW)2IWlCOX2KP!pZ7]-aB7-"5C&&93YA/8nt:-jU@/jKFIa"gdC'`L&Ip0L]L%0*X4tPL"E)N%HYeX863Y17<a=?8ED7"b62$K_Y^c`BG<kq*P('j=5F'i>\)VYWU),m$b8DeE\)"bO4d:OtMG47<(fl+#1DcQh?&GYRC3[397k1")]JmZ,j(feAhdeAg6/obUaE(iS'LM\TVTaP[-3Rb%n?M[oMLZZkk&;h"l>Z"g5ktP4e;i8TlR$2B)mt.Lf&+).Xn+?[Z<5j@X\6sa^G2LJYKMhm]HRk%r3@oV=IL9pZ?9?g`uerCgu9Y]XWY(QM2_WbU_nl[\S@@*"&cK?AWro&>r].b2Jao_W`Zg),FkVlGC4r#p3HE&rSq=D0t!Oi2^BoaGs&M%iTTfeSKCc\W'lqPTLQ(N20A#1#_VR*lfpcb&l(Z+7Up`^Ul;X)'9Al)#ANEcTd0Fh/Se:TJrgjsBc'^QU%G%Nel,PO9[XgAed8+56E0EDf'WHiUO?TX_p'No1=Vj^%#k=IiS^sLFmhL-Kq_2u"RtZZaVUp#S"@FVB^eGB-+I)0pPZhaHQ.b350Vj<'PTn86g`_CMe.VuN:"C2VJrM6nt"F74b[7/KFWm6#k]d3cco1j1#^h"c7!L+cMsE/n!Ab7NQ<\iS&(1&-Wn#fi]JG_E"d:6Q5+/CFE:&9:83%`\+pP!!d:R!$9nT82Eq610Ke^KnGKqX&FeJ"cVdm%WX6AMr"Fdu8qgR&44ZP#mBGIim/+$'8#dn5SkNc0UW!A6_?ER2Y+Mec]_^`(8c;CCl3r<Ol<-_$p87/7H;T#38*k2TBui;gqVNloNfX/A)/S&G~>endstream
1764endobj1764endobj
1765% 'R124': class PDFStream 1765% 'R124': class PDFStream
1766124 0 obj1766124 0 obj
1767% page stream1767% page stream
1768<< /Filter [ /ASCII85Decode1768<< /Filter [ /ASCII85Decode
1769 /FlateDecode ]1769 /FlateDecode ]
1770 /Length 2347 >>1770 /Length 2320 >>
1771stream1771stream
1772Gau0DD/\/u')ldas'Zi(@&HN$'(tMiq2k6;2Ls2P[X]E<^(2`7q%AlrAp:5@J)=m^79MMpV^_$J306]!ln^HD4>Y/(%Ie<"rf8S(pC$iV_iTTb/Q*LI__E`\kblDqfpD<:iU5CPS7[sV31+(!Z0(uN+.oo6Q*,eJ1AN3&3'S@l7s0!(#(shl*oWV)'fMH+SF+YupC1C@5)Dr^;'03.rmJkC%B(&-]RTnB2(_#@id1pipZFN5o3"'P<ZIk`9h+*k6^^)kdMb]/fF%TS\)h6PC5Q5tASk!r;@?^-RZ,cp<+1Q@s-sVt=le!a2n<\HKOeM4W@8W68P:LJG-n2Z6B.;36FE]G;JV.Nl`BJ*/S.u4*"WIpOCXpOpOJL*8o/KkDlFFOlB(4>8qj+Y:p"Q[>5,8*A/L4V.N+>H8T&"j34II-=gD<b$6taRmn1o,pL'`7R[;\I@=js_X4k]*6C%D>]?"Pe1jK\&SfqSE4a]9-ZRD@Cn!OC@n&chA7..-GoK1K<!nmjs:'B&\.qO4SKmrnKI.]?DNlTUe`sF(^>\Zcbpb*aHTV?Gq89hA7I%\qT)bV"+"l3O;&B]":iM@BA71;Z@^HToh(hqB\)J'8BqH^t0=kG)?<<;5!g4[-RhC1id[7EHeS`B!$M^$=rQ/EY)HHiCrC9nn?P]!Ni`^M1G_\FME<b#.<Q%N)GeP^/"<!@r$b?W41k>Z6%e]pokDG/ZhV82L9gMZaOjOF7(;!U#06#^h8N"s3_P#Cee1tW1?l*eMs7CargDbJ#f^UB);QZdaF7K.nh(Ob$#C5j.^%"%0o,Q-_m^.=L%#jFgX#Hh?;lC#80GIJ^,<c?jeDY5X?1Q6q5GS3\_a)9mX%8@j<:>DXbFR7<'0Si3YE&'Sjm/D#fR>/'DrTb9fT=RT.c+oK%Qi0Hu/rel)9(f.j,LQb''S\uS-'OPSdOCMj.cLM%?VmiYK^[VFk[nj/T,eBl/o=<3]]G%%>&iir'Wl@D@NR;@D;*Ab(8d_A[3JkWFsRF6V-m78:f:hXKb/42C2$MR!A.OQkf1>?HT$:"@$fLMkkKqN#fTj@JX.L/TN%u7R6l8b7)1<Jce9Ru4iYcj"^-tL.Ff=d_/OF:a0aqPdt%;#UlS$`E;k?LoH0X*SX/n?-1^H,W9(4^q<7\ODp9$73DW=UQZK@Fq]apJInG?)g^`S*')`t,OS\\i3c/oa5u^im]c&e*<0oJmC1^NR[EZF4frs)imtC\OS!IB:rPqN@ZAX"E5J#4FMo=a1liAr,qnhbk--V#AHF0msht9UUj3"X94F=d?J<o0VQ8htBm6uEm[7nm/@5P`j9u"4lcVBIU5*_Wrk9\'i\UH%tJmqR"cN)-e>$@0=c`l1c?1k*!k,P29k*<:GWZ1=ZQ[.V^&N5H'rLLe-Sa/^aj*7lc%=_\?>fi9eA^/[]gIVpGiE!Yse'R"K,:#3l5B$%eBkYU$`H5E9A@b>1+F>YX24VP/#:%?#VL)Aua#_@&n=D=/s&dLN@O:?U!U`,2*U1b?Et$dZ'H>-rLY9p./<'jtJ`N(`$pt21<V5sXIkp@Xqo_eH@/B9&8W&Q=(9K.HNDdLCZcS-\HI<(kW&"EqOiF-W(('J1[J?`T);hXq`X(uEKZ>3VP"j[f;!V:saNnT;9uDGXJ-:4WR(E&X;6Qe(`j[lcKdE?qA,FN\@iJ32/7r%q4["?s&d)5;(N$3go27o3?.\2(WO:1i_k$]ri!PfVQ!+;$3CZAVh7")&2_:8_Jr\uYF42.^N$ga^_nsHJB>L0NB&:7PI3A$\B!$Er6`:q]&/i!81?3m8(Ip&lKBmn?i[110:9Fof,M4@bJ8*_sKfpQ;gD@1,),+V%^:->AVj/Z7>[QNiQ1#%".(I[3:6YJ2$L-m2I0'd=_H@O"6W#^'j7%m%T0X"lj$>AZK&LC#^[(n\G.;sjX4ZD;hJH>;IScnGJ8mjQlnQ#-!r?'k_:\]-&$Ena]@f"5I_Q*a?X\F*)c_;g__=!:S3$BA.bB()Ylls(<hq,`]V3BsL"W>HI9Gi*q/m>oe;_r56\PHN.MC)?&MI]CH]FscYrVJ%pWDE.5lH85@Z'o@#(/<F:kfG=AA5E%-G2Qn0]S7BKB'f91rRG1&tA5_E)!L:l>su:_/75G.'XHuCKsM@7cL@YrAhsLK('s4RRRY?*U\uG'QElW%S$Yold4qJql1/qn;6+&G)s#Ra6rBP;2o6KE:9a"mL@]4s.2Y9_Z]-L*OP=Z>KMo^LaBb3oFVd20l.p[aKsFW_(;*N-I\kN['NVeA_88B#/6OLfq<`OfV+kiDn_][/"/l$0Ub"3]5&_K4kVHVO2KojUWUN7NgH@t<7>Jte+q[h_MFj\~>endstream1772Gau0D?#SK='n&%!s)8pMYg_$*M>D=E4=&\+2F+K;D#sN1pL,<W7E-U.4#=7FJ)>>9LpA!mG-aGF=:g7Xqg%V?G;uB!reC!WWe`hkkbh3D)CDi4BK2$m[.lu&/C)T@3'SAMSt4,?2P.q1r-FAdk@];CC3=-)V7bFE=(TqXfg$Udlgln<m.QF9F<+.k;*i0[k,_u4cWS(1m67#6/8;(4[;&Y#b3)2f51d.s[F^J29GT6bCN]#YD,lc9/,,>Fhe;Ph-UH$.YN'Mg*V`^^LX@dss/6G1@Z/ol8`,/"B4C[lZ<5^>^%Jh4f6<QVQWZ_;&T&b%-R*;_#NL<ZQ$rZZIWP8Wh2?GO#*U.<'<t:lM+;%R%p8$d+[g,fWF.9F&Ep4"cI5406$J[8P/3Rrp<j9PX-M<1md33Dc[rmhbTJK<;e'(k$cq*LloPON7(3Z+Q(uC0QblsZLm]$XDp),>)N7_93qlSh2.0lOCpc.f3enrVW(Q`_W)W!ecqus*.oWmAQrUWG;Hjs"WaS6-AZW!;F/JV,[?Es1(B]u7-d+?\=@)=t+%4rp,E1+H<h=@)TMNQ7@4E8VY/rQJ"]_u_Z-cCNb9k;./%Ar5[VV:Rr/?L3M;8trf]Qj62*Y/cmQI!<IASYqj"Fm<@a%!O<%R^\IJIio+MTZ"hXtdZ(@W1gd:bY!VR'bkn[Y7;io/t:9c>D"mT^3rA2K;oe)T3N0#s/i4Ib6AIGt1)Rmb@,-s>ZC+3Dg)dAhNKpKIpN'%Bf>%].\a:8G`7F")hf(/Xjb<jk`uY.r,:3^l)ViWKH)8R#,n+M"5+24XMI6Q<+?kQ)kqBa:8qEr?tq"DG3rPopX)!E!Q!BsB9QLk)PVC59B[B\E502tkeUP6iE!RL1eMa5=j*0Xe7\ZrF)Qb,hR1PX]f_80BT]:YI"J4LUgB.e5&8=.0S#K$DD3UU-8Ebehkr.=HS,Lo:7h9)i%-m51Y@-IqR76S6'mk2XS]:NatAS9selF<:4$?f[9`T<UX![mPJ]7)/$qV#I+m:V.Tc:fUNj^kN:8<O-4?bNLFl[d1]@lkbQO:P=0]&A/SOc]q]"0'3=EFJ7S+WQumW&NH!O_X=-rmQUP2>1eFNqk-/mjnKdK:A+T">)$Y`=1PU)03/mmAb(/kM4@:i1m=\FqI1p7D;lk_93f6Z.Rc(ZjYn#LW;3MCFfd-$NE`;[Iobe*Gb]O/ZJH]L>A403:3\.>"_+a?.6c\#?5+Ib-X4k.2e(_S.G7U3b^$X/3SAs>gr_Q@)Z!Z6RPaamDe-e^Zt,&'3%k^r?"B<9q!(E,C,cCA#:%>hVL'hcZN(jt4oe(IO3)3D4Qng=K6toI8,>%jNe,rSi_f<_iHFf$;kq6@TR#]3_bbne'n(KISrEQDrQh>^Ql4CtP8*:hHaL)C'kP&1PKB;)5?WY8eS?!MOiF9[('t7Hp%WaYN8I]&0nObj_IFp6P$Qg!@-_""Oe7D71`cJ`'+u91@d5GiMs:Oa]aO4%VQf\sl[6GbGA-#NLrjI=DGO'$Q,Wfi_F<A9g:`_I@b5J-ASCIU`Gm7i'"C96CGLt/+ie7edX=crQ!pq&)t7NIM4<Q[osk'ImY=5e$dXDfac*l\!J`qu=j((EJqm_mC-XOn'kPAc2\JW]C56pq)0$<r>>D>Zkqg\amU=SO)[h"IYhc"?6c^Bb/b$ILoclVuZGlYE8$..L34=DX9e2_:oV'7"IC[\J!ffJ'@K!.)L1_JIEW81XP%Zt6`^r!,:%<`3+$k\G&Qb[cLqVQGm)#Dh2_[]0%C=+5.Z*@j$t=@h*Y5En$+nk(ol7_OqQHQaa$ruLehDbO-Duke^Zc3"G<>oNNYs:&#OglUF^__XV(ZW]7)(JhK&&EB4c@[:+,UbO7)VaSd@S.<-T5BtA-hi%4J:ZK<&)>g7g$O;.Po!O#lUN011C,8KFs"#3uecSV]e5NPu+bJ_)8dnVN7-q#>rNl.'XL!CS[d\,&pTRi>a,NTE5G"VU<P0L\mhl"hS7&P9Yb,Fm*Z]I'n_Tpe:0+\Z`EaA#sjjMM50KEl68>BkotI>=j'`\38:.JdGXAXbm#R;d(NLL`eiXoe%#oH_`$K\R/!?q'`d`[LDsf)b*N"h+.gEIN$D+-S_A:%FiO"NH,MOd$1XW9LD-j(Lan&FYoOmo,ET0+-!itr5@?`4_\g/MuRqW%!dI_U>\Ao?mXY+Wrkes"9r2QF.QF+md`h'=MLd\IJEXV1m6h5FO13*gH?V%in7itI4iEpN)D7f-I(*IZtl!;-lC&hPZ%hK_m$D?8MZ0eR0_QLQ#ums>r!MB_^W>)P*tk2/&Qf3S_J78p0T1_U7M~>endstream
1773endobj1773endobj
1774% 'R125': class PDFStream 1774% 'R125': class PDFStream
1775125 0 obj1775125 0 obj
1776% page stream1776% page stream
1777<< /Filter [ /ASCII85Decode1777<< /Filter [ /ASCII85Decode
1778 /FlateDecode ]1778 /FlateDecode ]
1779 /Length 2341 >>1779 /Length 2296 >>
1780stream1780stream
1781Gau0DgMZ%2&q(:PJ)JKol%W5SbOKEc5pJJ)!J235A/!9nJ,q6!2CB3<-)ikqYMW9SjBV&[PG$Z]*8.3H<Muil<O'krq!3_0]OL6b1\QmQ53lit<jM^-HH'R3YlDq-O8a?Ne8Ns!-Ytcdda;Sd_)',%J%N.`1q)E#MrL10IXKWQ9C:a6#QhX$"s]H,"t;rAfOW2Q[)XG_ck`O\I9i,>[_`@J+>-nNEdu!?1e]qgZ].MC?OFeq^,-Vk9J*>QZ^beh(T_VN@,?9?ZTm.0o92]X,KhrKRMD#$?O4^-dPRt3V=[GrDh?JmHk;BL*`Hb2]-U\0Y`TS?q_4cK1M(g>1eO1$e-kuc<?iLUjS+a:>#U+Y[D>$:bI?Q[YIUWImMri#X]=E68U^_t(B9*^<h.rnqIfQTMatCG?I9]t@S;+CU*V@g[r8Hi[)gW@G4%;AWeDjHUO9G4h""Y%Ph%]W5aH5')ReYZduE0Q;Yl:&NhGHJ`Rg-SND^,Y(fsuNDAi0L,]DrXmZ"91D.gaF0g<lY1b$m'D@ne:(<.%^4S#LQ_F8IK60]TD1qml*Q:P1*SH#?:b(\2li"D?VZsN2(l$'8j4`I]SFbO$OXsi@o\5@,ILFdTm*keeHX#;(rfP2l,jjr"YZI*F3S2Z+YdCJJJ^&E>7!*4]r)rIIlmAa=.opU//$(#O$]S^#="IY4a3aRXc8^iZ+aW0RQ65[c[Z7H"tI&K_6WMnX]QLL0'Io4icj@Uo@X?\\`e<&7,B(EU>&4<1ShM<:H(0JGYr<)JsK]9IK*=33;7,1@d?sC4IKm!eGh[!NobKTl[n:o\X%C-e1F9#N12&l/q%R:55:IZrsS@%@'!O1b*C)$3K/9Ya;O^_L8V,);i`0G5*=$b`0=m1\R,s_R!$f27fk7m6c"))KE7O*Lj&@ge?-6fMC`5O;V07_Ve+Q>N>L)dKaaHYdb?kBgIGDk=aC"dne^%^/9*CXifDK@maj0_I&VbX0GM&o4?A$Si@4G@.6rsEL8Q9m3i52Pb(X;uHCr/rQXP)]P5kL@&kd^*bSAfiF3P@3.*3d*$FGr:Fmh0E7hCkZ]nMNu]:_ej+VZ58)`$7Mu'(H_?//5\H>IUEAh*Qf>B<YEmq.:Ze3%>@XY^p1NZ]H+!cSdW1?MQ-g2,d(_7MS&bFW#D%&!mDCOZri0g&@$#N"PSBP+1P9tY!ah8n:l37&K/!=(ER;ti+9chGU,9aOUX`JoC,Gp[K8P'!:;8gB^D2YS5VRo?+EHd&NNHb/%u5U:/P]@&LE27m(]JV!9)Vl8[T;aRqD(M%6>QS7;FATP3`V-$Zs!s^q/UWJ1.6P$JH0lr^J.S.?Wmiq38A62h_rAW>iGa)7_Zdn@_<OJtJZC6hP11*(].sIQouBIj0*A]dJlE\R0LdbiqJ]6"TK'Gs<H:Wq5)@g`&pW+)3"7Oa1<-<?'23fbT.A<`Z(?MCf)k;=)nLdSD5T"L8sR\m'(bllC,-#m9F;F9>+]0sKJ"gd^>uZh&Y$*7a#@)7-.#h`3G[,:\O4!eQKk'k:)G!T8Fo0H.Tn;;[&apOI-8IXaPo)7h`Y@]/7=DYRqJ`.9H[A0729h?;L?.VuDT55Z2EiZLq.nb[Cc0MDM/R$`60c_c>UZl]PB&5('uD7Y`tnC/B.@tt$:qq3LCL*$c!iLoM"G4?A`8?4-&/1CbclgV%%Q#Rs5!?W4ZPh;POk-)d_=D[G$@H4qKpF0&RI*.Up7\?bqVbW/IoY>/:k'_`'Jd/a"Up(XnmlDOI,8_[OdK0"OI<@hcf3m*\FUK^C%4K`;8p&306/RIGI:MCVo@_G,R.f]?f'iQf4;,68KU`l<LSCM-q%u%d^C_0SC590V<-"`J*'q7=k0csk7jfIb+^gg<NATKWMf1;f-r(F$RcXih)@(IW)As>he(Xc9p;]CLdn9fDERKP13u+"KEjKUk0i*838D"C<NFMtK7H"\uX-BM=Y.!4lTci8ZSG*Ziq=FRMTUU\n[glY>;s9hoO2Re$:@2LA%UZqtfrrfVO/N'ei@hd&r">[62b#M7kp',(ImOBp3rli(^9K^cUa2K9PjI*`J"'YFHV>*/CiZG#2F-V>R9LS@\LkZY&,P9F"''`.<1r87bRb5l'!ZE_E^_i%"V'tu@sf3YHp%8n%eqJbmPUa4V\n$(F2B2affKrFG)Sm,YX[)M,:5mK5J'$&GB<sdLOle*BkIZYiI#mcqRpi3S9:aIcSQJOCcn9.p&TJIhqD34$_Ob`lRV%:4%2:KrTrc)F<9K$E:d%_%5JJ1Bfq#XY*mm(^OLDZ6?72']^=T,2TuA>2@dUXmhEB^Z!B7J9D]qpnHa,]8krjU=(\f!U]1F<2guM~>endstream1781Gau0DgMZ%2&q(:PJ#J]&\f4hTmri:S1pYRL+MaWtP@XEeJH7?"2CB-:-)ikqYFeahls/nc';Lc0N\"+O3E:3(`@c<&gC<US7J-%QqU\0&\imVVW&mNTFSdTekP"]7s2RXcG3sN@UWtP69MQs[k4n-^=&p*V<l03O?O86CO#g^KSK/e<i9IlPLq:J6Ml`R^9G>u38LLV!"24J4n6<nNnfuui8[k<Mf/R*tppFH"Cu+J`;D&@)Pb.;3fgo#$:9kOb[J2D_\+1g+FcB$b'soe,/VNhF@5l\2Q*3UCa;YcR67a-O,t07C$&r"l94:D:o$H_t9r82_1Nb?.:!H&2+k0)EB=#.RB.'.-BaqP7"C<loEfps-W_;TN3;B.g&8N1k2h"+>YEI32;<Pnll9Fd$<g7=3g^;JZFfFeZP80!K>\\OeM4%&3U<H41=`bi0]X1k,V"e/<6ArCsjr:>RA>@<o3H#`LUGKHdp?Kg)'rmKTD*2Ar1O?-&;^M(!]W.c#2^D_LW%`h!,-XgA1.]i@i>3tr\WRO/o!p4WJ;4u--50]'m5D(7XIT,[EmQs$<*>BLNKZYSTrdirZE1;B_kO8Ta<7<lm"p8hHX(Ip`HT-[(*#/!gt@;;>IsN^2$K)FV9#JZ1]:6ahJMBZqhm^#J1Y2u%JGJU:hI(I-g(OsRL;7\fMeq>cM1)pgFQT&0s/(1Vd!*Z;RaZ4_-T&Z9pl6m6^@iWi,4O[QN8<Hq'(AJZo8m@m"3$`5VS='q)U0HC7,7P)@]*)kK?[h('p>&GYAP.U>K>+d;[N.-Z>iV%\9Jla@4!@/cot(FQqNb-d*]j&P2+/=XH\2gs=<\)D./`<3s,rf39[3GWBL,jgg#QrgHdGlp?q3-7]/=:;2/SBr@k]nS-];J9WHX[k57>,G.@]M.OAX\7XD?WYq(ZkiW5_o*AQhVXuEZ?3#]P*+DF!bS$anjTfC:S#O&TCnX*WOYUNLe1eu&+f%aGGan0RGV8JD.&rFsZac<D/)fpIU2"(68MF4ndUFM?+_-kO'5.L5]bd[_dk[.85*jL,OGJctb6nig"Rs(^=ZhS32j#sd7JH:FW4!ZaSq2&&Ho-#gFUje`_R8aQji$5Y>[<45E-EV+('7>="Mk"1F0bl*g#UPf"kK/Tl;nb&GVG>`X'eNm1[JG@gN`nPjerAO\[8W84jre;9]D0IH+tdLldkkY=7WV<3LNm@,1hPf^=-]1?U)D^h5ahcViV.Y6/$[4+g5p57ibqC5@5/0i"$,AQ+<)kh1XfjSosbXhVe%!VWU%+pB=U*g$Inh-Eu2S/!Dd.k)>bQG?`T>Un`-bm$a.+``j_c$FtqF5^FL-5S@lACpt4imciKZGrKW$pYfKt=gmmn!YqGlPtW5"_$BIeZ.K9^i,7l-b.a9@?\RAJJ?FCUH$_]e)S.i[@]/7=D>7jKaurbY+!8l.^C%8NR'<_krpX,?MnLg(3cD3Qr@eC?@U\\*58YHiIdFm<QDLV;]'FS@:G)*_ki%$[mHiBl*5E6'W&IIuhrcZZ+g%;OZf2Uf0#LtcQ,\LZ"aju[Z,LTt2SU.`j(A2U"+4?s^O6O&#X7pEAWK(/fU6BlU+)qm..)9qg1[d:d4W+:EC"l`8+:VL!BDlZqa/aNN=MuZFoV:^19tXBV,_)>VC[9&DpT=2f3OZ@gAqK"cM>a$Y<g,J9G42[0b0c?]eYR7:S;rMRjlTtpAd;A^&q"B<_=]nF,cb<(r%P^[ZA@'pZ4N2C\SiqE>!PW=WED9(CSQJm<pKX#e646SV01T\m+M1;h+F,=lu591]QNp,+]k^mb&dOJ,]@k[mdu_k+4^Ic_Nd4[D`p^e\*Sn]9C.dU[I2)7mbhU2c`G)9#X/C6!))%S'7ndUSUImF#`!>/q,=ih!dETC`X'jd%&*AU_6=b!a8TAj;Y%\Z$QasAMo`5:XQdq]K:S'jpM4b-!'FKZM'WPf<5TL^OK&k^<?(%#aidk;t0k2A)OB83$9`/WPdNCnBeF'#[piQ+,5ZI.2hbs\AV(cLE)Nba-#Fm1aoVkQCqW:X^QkHB,KIAfhiAkAe7]h1KZ$+imXebU"-2P$BruqDV1&(mh/,#i7A1TA7$4h:B*iXb-58:0TuuiXG?$&Ocp2UHXqh5Ff1@cE!A$<rG].CVrU1uX7a#$9C7,RZk^)i>29EsiO$2*3id_(Fkib^BtM2K3RYGrf)I4sFFJ@h9qkY[<:lBP#G#iq*Y(]dA_8+-I$;P`<cZHl(>7N-;_OH3U[j_E.iS-XBl=uE[J*;)H)@`')5Q(#T4\<or4pEAitlU^n^65^BpgO~>endstream
1782endobj1782endobj
1783% 'R126': class PDFStream 1783% 'R126': class PDFStream
1784126 0 obj1784126 0 obj
1785% page stream1785% page stream
1786<< /Filter [ /ASCII85Decode1786<< /Filter [ /ASCII85Decode
1787 /FlateDecode ]1787 /FlateDecode ]
1788 /Length 2346 >>1788 /Length 2325 >>
1789stream1789stream
1790GauHLCN&7A')`jos'`,sO_!Es/\faY+4An]&Ko_#ZYn0b.107QCt<pB,SaN"rUKUjoroGq[UUT70s$2*L;TE8B4g@)$\+cFoja`b7eGZ77p_ZS+aMmUQU\IV_s$aRn'_rRS3%S9T\FCnLR1B@F*dE-SX*]a@puJJmXu@R-S78W:JO\.Y^3M%Vor\E7PU2Gd#_<G2M\r\3L-5a<#NP31G[/u;@3/&$EK<r=_TG__FR$<#tPmX[8gpM-k0lF(&!5KJ'mKY9%YDs'POaB)RN=aRV%iukt>N><`)U]4L3bQQp@HA.8XVWal"3>['f.YfBg4ndk0Q2ns4XW>7P17'5?p._P\q+9DrgIA/%44I'[#hYM\[g@Jrf^-cUoGA>djYJeFsd6)#=i1Tb4tMe?PA#+N\%C4X?m]9R2Xc/Dl/lPCi`;R8UpeU1NPX>.c25/[&KK4aHB%%!mF=VS,9J0[^g@C.JJ+r+"=-Bb7cOf]rD1=GUACs[WV5TO=9Gn:1sMSjtpmp*T^B<[FUA>8i8$f+IFBnRm%l0eG0`2_`b=B_M''Ym>&+!DKAOqq50V1_35:oGR@j6QUiA-m'S;^9_I'(fb(/i\=TO^(LCK<caXRmM&TZg<sEld/7Y25[6l`\?VO5e0E,KqUI.`?\h#BEJGG.*ONO],Tu4G44Ocg@%))JeHbDN0LRVb5&?pKrlRjC'QQPMB(1KFUG%0UZBi*OTNI\c/C+G0A1^_5I-.hjP&ZfNf9LjWDS\WGFPls4G)5ZRW9n%8'%[2R>=u5ZXRil"F3.+'L-/,k=AL6dDXfYe$#CaIh?]?K3p6>2++p]Hd'r#K"grI7jZ=W3RM;"<PJ:X=A\m'CshPi_-,)'l/=`j&l/BV#.TQC1fbj]4C%5RUHNjS[&fGDFTO17MH%smdf^(j9nR>Hfe&_;oa*J4TR5p)s,%r'.;-gSYCKe:Y%7`5O7K=$T_InfMnR.'g96q)O#:hLEps99S=--!2m8@]<6KG0DsoJSGL1cgZBM=V&6hG2El,8Y:o?$2S3+,"/iXg/VGId&E?PW*7&b'C,4T:Pl:EU!CW9"QN'f%r`^iQ')b/D8Ys^k;I&!X?JrY_]]@\/&h;764i10OZ.UV\i+\APPU`[CPm=3G;C*lSQ4Bs^Vc3=@q`ZiM4%G;95b-%8t*5pABBD5DHkDE7l76HWA?+ku-P%j_d]pZGpph-^3q"ecR2k#MOT$6qOC<TX*D<Qk+IlMAU)Qa3m]G<$`mQ5<Z>7QlnnQXdM:Yif.CMOZ=8$d<SC7RLbg$,o)acgia4HG3Lp"6';B&tr4"_b\NijaVdm1@k'C<?6LLCI1U$`-`l+O'I]CQXtXLX9SDI9a>CH+dj`W3Ik89X73&B+P2iPm6M/#,/]V7FMCOM(Gr;05<7`iNJNK,<T$.XJ\C==%^TMB3BDD9pM?jgsjcaC$LSUffPE*b+I7*:cP-5MI8>K=J=h1&hPeqG]_1A7n5.m]AlN2[H21<,mg]aZakX2G3eEV"8G>7el[MFpmO,IV4P;Cf,VHEn`Clj,f<V,cC27'>"tmX+]AOeEP'N^f@E4W379!*OXSq/I]FSgbJW[CZP&*Ai9&'UTC7:)*f@)AEW0-YgX$)F2K=^@VO0AUeNulDm;h"rY`kKdIK^G(Dn7+Y6dReeB<ff>:(?PG:mPm/+PSV72C8%=oVeNjPHd#Ub`FEp<r(FJ?Zk%;Bu.pd/^<&p$\=/e$++n0cXaa\20p?-.>3)(4/oF/IWmO9`u-5UMAWilF64r+ACNSBo*Am&=UD;Tj!qn(N3<Z9h.b"nY$sADRi%Qs_FpqEbkjVDPkW=#b:\NQ1j.8b'H%D:FX4(#Y)4p7T.oKQ$u?Q(cn%m,rYK-0=@7jRTF,kI=FNMT6d$#9DBleooeQF?rjDksVPAlEFL0gffUF[^"BY&@^;"r;QtM0pm`,P1Q[6*tIce<(5CD/kUMm@T2FqK%%;)3c1G4./mKL;+89CoNi=C=KL@jKdK>5M46N!'n_rSh[\5?)k65d<K(jN/PK?H)I3-04ub@l_9)G;bR3\P21$otT^_ILV[,`ipPVSnhYXq*%h-*\lqOLVGj,)lc]bGR1biH#6JGZbd@i5>ReSapo\'Lp5_X*9PlZ<XDklccX7V;h(1o*B]l[`VLe4tYP&DcHOt0Gb+u$kgL1>b[gB0O=>?3S%JncJI/fDTd#oaHZd@CqM0KDn"]e:>e4p[G2(9]/kFK"43]8K?NhY%Nn*TSu:<!MD8Doh15IHF4#-XCN"E$KBAiYlYjqm:.?MKc$9jqpqSX(_n.^@IpGfI/7'BX`9=lrc1\pZ/&rk1ZE[Y]fPPq_G?Wo?EbBO4-ekNIPQ([J]&^!~>endstream1790Gb!#\D/\/u')ldas'ZJs?oq1%;:]LjIrI&8c[_.fNXFR8/rCCSPZUdfFa%PVL]7'4Z[<?"a-%u!LU.H3I+d3+B:aB\G(",cf6<k'K'7tE]m]@5hk>$XIb3o6pm-@KT:Yt+HK(:[%Ych(ot:!;1rPd1PCMA%)(E61f#mJWBQ8@HG-C2qkm7c!j"C5i%;EJj$j.F="@Ko;V=Rr'B1YEgBh>*G[8r`.;G2ll8l[?T-6=I-UeJm$HU6[VB`-Spp%&jC\o"YB;U=()A%ca"#X>#AfX#-+Ku/_&F!Hn4iSqK*?F0son-FF>+X?siK^P\]FDAnB,i-.\:[AE@KVasVOq9%XIZialM,l[W9IX+5Jtb5e?KLMK9uIea=@5BO[7kFG9$jK(>2>%7HR.2uaP\V+bUWB.#Ae`sjuTeG_\-9U9<%H58tBaK80<PZ7:n)UZKt:t?mj)Rcg0s$XZsCE3N;_-:<-cTZkfd-f[pu$r3\22rVjn(*YH8OfDf:_Dab/C1,.Lo6ucC#+GiC(@rk%qkYnop,*)"6WMkQ!c'a^C;ONp"2LD+`FhRcULN4`cHe>=E9Z9?d7IbD?<$FFL'L-5.kHp[LAeVF$qY/%P+/G_X^K^ju6b0RNi9;4)?[Lage(FX`eRCOs"7s.0_TKdGU@01t=jM`mE1SNd<KJdtXs,faeT!Wu\Cg%8Dq'+oit"CdI[re5S0Jbk!gQ*GXD-'V3kn,1Y!,,5>BDNNl<b-X<\5Ic=+3HCo"LCr9KgP!G)K\AT!.j=gDdS.SdO?Tgj\_RM6Ie$<fUA=r)O<+et#jufaCE]EtmZ+'=Uer'ni\#1-&o^.+2ir&*M6?LC:7S\1!lbJ#h5I5_DJh()N-ASk<LcEFGtob2kUQdd[IZaC)i_3X\UndNgKg9du`8dSZ-K(V@#gf,8r<T(CZir^i#%L.cYc^s]m_JjULu[pm^uf("pREfGGPYJrWX/#b\HoD_)>mc]HBk9(I5"Wh"j;Q@?!+u8Z$cBi<h4I9Vs4^9+39KUahKh1gP6Y8-#)lA&+Q(32#mZBCZ&mR[u`F>6+Y#C@`;*<+1r2s@bH]_D/=$;N+bo?R<XrC0[4+UGPbXANA?.#hdkFHdsh84s)AnTrmV7Y,,Dj4&f=^5$(h2U;1Eu")3<sE(hcQ4Q@%S+R(dooG:kJI.C@T8Lnq6Y*odb$O%K]VK<8F>%r[JHlALC8u4cdG?4bj8MKOdF[T'Uqkd\9>peHd>Mc@oX_DAr4kE&4g>39PY5k+Ki(o'E`4s9.Y;CR`nY4NTP_LkA^e"i[Dg.dPCT#2X_%k=<4=D#VP>k9Y&_rrX'*9*6`.ZBYVp+-@h('Nj3R[cn8tj0pX?H)5rN\8:'Z:A,=n_.HQP.H<Yd[Y\qGuco4gh@h!_An%;)&R,,1Ic;@k,hqURkA5mI`ce0!+NfL"n$`@GF#sG_d^IA;WpfNI(,gI3-P,KctQ>^h0c,M$;;E$ggpiui!4#kfqj5RIL[\5-RQBYY)e']f;<c+X#CKK^`,<M<]g\!jaGbhs*FU4Ea2.$VPk5rg]K4MME+`+d%M+("LJKDE8[oI4V0k&3?AuhZagm9JYo46K%Y0P%:<9>N1$+u(Z^jA"b0(Y@VfKne:@H7Yu8UYaTX36(OcL>lALd>-"fDgFi-CuKBLqnbf8qMa7QR9a/rapKE0(tjZr\<R:LM.>Wo;h*'VPj+e(E.F,[=#.OgSI^s:O@8c<HIN01MObr\4FO6$'WZYTdJ`&c.6D;Io4dL#!8=V<O>tdoineZ[!nM5"Mt+=h95__qqHuBR8-r2dHt5__9ndnBF/&EEe!]GYfQZJ]+=`cp=6r^CoJ<g88"k1AuY,72a<7J+`A;3IF@-E%q==%H?"DPJ*@_9!l_`ZEb"4*<ClR.2Y'FK?s(YX=(skIbj)mH;rr_Kp)Js`QDLZQ&Jl4SGiFsE"A/c(8d"m;o6+rA==i/i'Wu5Y8/$RDnl]%+q".&0`c_Q4pg:!8J'Us..(2q-]1,S!:0#qhYcJtHq"jK"N4!A(<N0Gu(1C?^m?K/2/f3.X'SmL76G8%[]'SD)^cQ,/$$<hejaBk%Pp(Hi%$]`F:I00hDaX_.@hWaTQ`CPT<p=M`/M_.hs10Z!#lI>_G6]5/%c*i<$f-&V]6'6+MP;X2SA)[Feo9C1\pm1B\>)o"*Mrln,Mb@<Su#>>gfYNb.%gA&NnuG2DnDe=:3H'_n7p=D_5M0(i>YsqV:,'<9^)?@#'D8U8>'A6FCTF%4n&Zh?@U^aFuBsfnWmT?jTG3mJioL>q50^iR+s>!0!L,FoK!(eXLsnHVlf2E_li1sh-#B"aMBV/CtWoVni)&_ht-~>endstream
1791endobj1791endobj
1792% 'R127': class PDFStream 1792% 'R127': class PDFStream
1793127 0 obj1793127 0 obj
1794% page stream1794% page stream
1795<< /Filter [ /ASCII85Decode1795<< /Filter [ /ASCII85Decode
1796 /FlateDecode ]1796 /FlateDecode ]
1797 /Length 2019 >>1797 /Length 2026 >>
1798stream1798stream
1799Gau0D9lK&M&A8=iJ!f%\;5[5j9E&7*&)0g2?!n1Wi`f\&Zp\&5A5Z&uZ/&dE)+p4^`3p:'G$lPX.J!#RRl<\>d)Ni9I7A:.hoG6@9`RHbirjt:hhCTEpg\\sn`00aW5]=%0^/3-p2Dk,B.bid]%&o?HHrVRnL`5VntPN+lIk8&::PbUdg(@.j#O7rJ0?KuV!IKrK'FX5#Qof-gfUcf@a,[m;M>=_OT#uRs+Ttr%aL]m&9Z`Vpf^)Q)Gol_TU7*gZPiecbVc_CdP<pX-<D:M_[(U<p[*e4-5-PS+X8M%KO9;l3CHR#43NF3Q<:<+UhXn-8;T+>3J`@&PFTYt(t/6$O(/[RIfJf7;u&Yt1<\o<H?^<UrDCl_^)_WcQ:)=aW0hX_:l%JK[?.`:eSuGDi:ZYYAu%-F$'b)ZY8?mM.-Uo=(Nq#LRRaf^_1SQh.h<C>[]'K\(UMV;KM=W!:Orb-aKeV/7^bAVf5(19>@^!`6\LZF=iM&G9d*FC9Y662(*]S$rm*,h>"`ck\H4,<EYn/YE[/@.bet`E0X6'D]O(Rj+PC]qek@!NcFcho]jCFYg%@CTJ%q8bK#s"Q)`?e:7GT,*I-+EQKL3[`B0pWk9J1_[>9@\(BcjFt//3j:/nYd"R;C^,rnJn)W5\<JN)M2NW@G1jVOS]bnY8@u>YuaZQ!jg?a-m#f%C1]=qWO,MhG]_8>+;%\^O8T6m[+O!n(7HS9bdt\Z)lnGjJWrm@tQ$#c#/g'/.Wh1VI59nna:Y/3hs#lk;JbFW@$uGAboC,>\n&Ajf+%iXosN%<(/oi.\`l\eTZ\3_^:CFa0Vr#*h=PAe:olBY[S!f^g;4=32q0/L=E-giU7.hMA^mQV#p0dp$Qt#8m7A+a?9^UQ+JM_cTR0(3\AZ7Vu/[&C:>:VTrZNI*TF6$C1nB@_S!U/F>8bMBkp3D4R[TGq/Dfg[?e5<p_X=3]t=EDlZTCarLR%_JJ^@Mf8kNW[n(:",rfZcFHgdKSC=;?<L@Om%D`?HE;.B1:r^2m-T\"9$JdG5hrE/)(#139VUY/'ohF9,O9sB!eA52Ipm09$1`.b[;5#iVN3Uu)EpqUC21EN24=Um]YehlC.B*2OD5R-q\o:;28*+!B?.Dt&bmQYZ87h*jPSBS;4W^@.]#!,[Tj-(7-%QDYSWbg<fKL.LP*q3pkH9gb<ONu:`e[_RU?tS6n+Ek'V(k_]SnIu]G$1qSALr51hD\'$ID#U&ZU[cqI.'ARhC[d6SiY@7e?:7Mr:%"!n2Mr.`^NCq:%bk`fK8d/*<M(26N5`NNoj$._75q*?V9[<UcWVK>Ta]qAkY$<WaUC%%fa>WinMK0W6W\&a2PqS63nQLWRBcjA;=_-$ZlqI3K6X93g66LO'FaoTY%6c#a8;'n_E2=qWg%N^YH:jBPU8U[:W#l6GMnRg[A!,N)^;(pV;@?lDq4?`]dI.LFQ`@+`-*tcF'V<c\4e%ld2p-WZcW'i.SNHK,5$qE,Y56N"h2GC0MY^'Y$WuIhY@GO]Xf>ni.uE"9p]3?7%T#fU@FaWN)`!$NLrRcLe]B\2RbuWlaQ6"4P,uZ1W5"r]AY_Hk*bfS<EHi*HC@BA`-GT"ckf*O1TN/le/3E>E?c.+X\RFq;XB-pMgWFr=aXkH\hs@B[5s6"As<pUk6kuD;qf7?>+nDKWWkH0NC,(EH]1'.A#*,9)e`F,dB%K``ChNmfpe[f)35%93aljGps!*NgZ!Q.A`VPJU*kc0QUh78^K=5%c&/O0nmBKWCO,);?^gUV"KtH+fg6'E/*rl7eE.;[*EBfg$7$nIs[9Tbjab$3bY/:3?1!cNY`&RBh07#Ym?Y5(7<SiRsgX&,u3WX%d-]F6W_21rA,!tq+W_JSIk>:c$erh+5]0$SGVh>>lXH1[J1kt_5OY6`6bNL".sMHToKb%AnA?Ul`I(sm=@Lcp%l:ABK&H$VLBR61Gg=T9QLt4@.UunO";*NqXuojofIU^E0F;r1:Z4E/f]'5TMGf/Q`2Rg:61u_)_NfC#DD?8\,~>endstream1799Gau`TgMZ%0&:G(NJ!f%\;5Xu4Q@*$^&)5p;%Bq8/`,Bcqck9opO[Uinq9lJ8$mj);@U"[$UC(I7&iDd6F65f7d)J;rIKjkDT?$Hk`WOPBE<KV"mDAW;r%c"!pjRMIQ"(%d)"`,lHT2r'1RAnBgaO:92.squn;\r@H-s&fea2i.%=6PEmL[BZS=g*SZ9P/VDpSPJ668E>ZbNnVL=9f)3,*)u7$FZI="sUY`]mTGIlrA3D7fd_Tlg,GQGG2>8Lp&;arm>J'VPf#Ji65sZcUa;(k0fu^-*^ON_c=dCV0QFT9B2Pk76C>'#d2RP$dG]i=pr)Y]=.=fR(/P+HVFZpmju.#d:uA?)HBX^+qe[YK&-U9cWk^hWko*"qLP/f;lNO6QS?uDCImc3tQHfMiC*Vj<MG5*/I"G>dk[*l?TR7s'`?&`KhF0`Q?P2_@`Ds+d#F#+Q8GK&$$Co1BWilb#qNCJ>H\Z$N$l+#VZ]DZ/DU.*.=abqKR8dadS^(@]:\qqIQATl]4f(?*E;^pJQ8E99pJMW'2IA[%)1NU[F4&5''=.6Crp:,pMFhR9[>G2(k8`dlLU&(s"RtXYUa^MTOF4Xj<"oJ4cp"_)N2KF=d#/KINgS6N"o-P,ub=O\F,SqGY@`21o]K/7#cS/bfEZ\k-ZV'@koOAF>KRi4<g65$V&.73L"c^."'NOXej?Eh@J!eTQ96!&Fp[9XsPOH`Pa]96Ab4]LXoNd9D?4$,HC\VH=Ul!<#N/84TMs"03X:>$0W+X;nZt]K.*V4hl?(W0:H>*5ZGm'78PtIo6O1%B2ME_qu9['[uIS8dXLVlKrRE$X/\A^chqN[66%gSp_<0[9B.N:@WV"ea?gaL-A!sbRjMC<F\sV?X#\)R(Zh^.%gZ3#BJ\QrT1pL!nCK(%dfu<M"]g:R,V+P?s0Af8g"=uWU"oV0XmiIK8e/l+B4GAVm'l&KIT[+p]fo':<;j_cCp&@=e=ic:FL>*Pl?23CKkb17-[+ZG@,9g:5=ud>sfX^.`ZBo(GWa6\Hm5PBOJnXkR8MA\\)E.H],(PO<ZYk\WI.r"B7t$Aj/]hX-00N,;ZK[Y,W7/o3<5*V5\3,PUi3s\;rZqmgNK;Xh)3a;>t6J;FCrJ#Mi?5;mQ?aX!:,Gg(,?86nB[ZH6mV+k-#`'cqeJL-2^]TXB%jM$Q#l<NMLarrGOf$E:W+;#Q4:5)1VA0Tq7o<SlG=!dsdFi&mXCkUXMn"m1K&Pr;a]Lg\Ug-VN,7^@"PX@PA[8M#uPALW45)>JBaHpBN4q=k8a:"j,2G%H_WWKVsQ,JV\)7'H&JL3rusNUJP]_Yd1k'.`0F%P1h+:dbli-2>rc?A.T/C\)(,;VS$HDh[1_2nl*o)76&4p;*GE&JC5B-PU&,lkE1D>^oZu1Q.Uu=EbVZi3F,l56CAW'i&B2Y3X>k!7Si8^(m6^"3"4uGr4:rdV+tD=_MZF!a0_I)P(/lKEc_il6M)9bn%A/uDXZpPY=IRBQX)&f,7@>s>W@7H^p[_@J2\cOo\ZoWpF-QWIWX%WGlr)4V`M),I<2E4)6LZ93*G`]e>5XXClG>HSYsHH%M-0be$0_E!#/%e94<"!h3&=bN"Qa?]$G%UlM8qr-W<<tL[[A5n<5p'VffI0l\6E=_oZ*j^$&-Y;[]\)llPMu^F8'Q*EKZR2$TVV[R#.&1V,YI#)##aF1LjUP"DsoBdG=C&6hhUi3g@&(1.U`q\2#KOU>"r.B@stl8&$f"=#$fk>@7F+QNLC71iMfY4n#c'iP8K5]TfW,6gC%q75/g<a.T;RCc50!S2M<iSAue]cVh`<35]Z,>?*qA3u8jg)\-R039\*hHRoGIAnW\-j_6D_XmpAmF!hBe3-OEo]kuHDfETVJ=&QB9RG"b$3GSGg^4TtM2td144addk^k]b)bW:Q_<TtMfhqb%',Ab3F@)mBVl#(k+%XPhfXpnrZ,])aX@5Pk9Wq0rEJk'Y1lZU]co!4INj'KL\q?(N7]U$@Nc?0&il[!u*/R\0CbAIAN:R2HV(]OM6-+*I~>endstream
1800endobj1800endobj
1801% 'R128': class PDFStream 1801% 'R128': class PDFStream
1802128 0 obj1802128 0 obj
1803% page stream1803% page stream
1804<< /Filter [ /ASCII85Decode1804<< /Filter [ /ASCII85Decode
1805 /FlateDecode ]1805 /FlateDecode ]
1806 /Length 2337 >>1806 /Length 2285 >>
1807stream1807stream
1808Gau0EgMYb:&q)^sJ#IctfNBm:8_l2L6Saj5ZJugI'*4$-GS.=(VUR?BB"FI4ZsQ$t`JZ9S,g3EV5R875])'pUdoE4U!rN`&GFScJT>@"X+bUHO;@*/K+(c>Y@<QtfrU_@OSfNf!1`6#(GV[9_:/Ck7Bk45</tA-IV(gp$,iD2;iq*?_[dWmDi/_<4isI"JdfO$j^4:8:a0Ke&"Jf$0?_+Cjj5mh<,i3S+jds/3"dP>Z3"<-T_F]jb>UBd6l;iWBn%XJ-2jjQ%?2i/5YPWkm*U7do3Bc#<)Xrs3'WcBuMV,"'GBIe7Q?j[Cb?&V+\hfjMScrR[ntQFur$!/kV/4ab\u8In]6q@e;HV",)F8>ef6C4sLdc;.XP^U8r[D[nJ>/--B2l,94oZj=kCMXICfa^sMuP\3$>W_sCb>@ZblUjQSL@qR3X$a$D-SFMI\u6k^=PL4J&+Vf@?M/WI_=Crg(uTr/^Ueu?)@2oB(WaW1;0uTCEk!&Kj5IGh[.64E(4K5Dksq%*/<#&^,Nhi*5cdr30a8qY-iX,D2MDKaJB,Br?&d1.2!!1'`QI5ge5#'n&:,aLS"G7!AM0g7tl+o9,Xd0ai't1Lao0t22#Z17i*n+Q$;9+B;)CPWaTWi@\.!JIZP[K(f\Y"aYLC<)6_Xp^qe[(/2LN:I3?=U0LA,Dk#ba]g<.8^Vf(Q[i&<)XoYQFZ\hell9A?ppQ%[t%!p:1f+7G,91d574^S!)or5l&i"hG*>oLWI%H[c"V7%/bb71Bg)2WcOOQF_*U?0E#/\'0A%`4Hb00H'c*@mKgY>a$)Z(;fD2H4OV?dIRjVM*HA![$=L5=:*'5Fej/^+"2Z,&HpVF0-=&TORoNLMO._;Uf=@E7)r:[&]E,];AuIo/WKa[LneM6C7_1AUIHKpBVLc,e#`>a<FrTd!lH7RM&3+p5DufV5d$<aKH9[i01jf(3j5(F_Ptp_Oa,:'I]lQdG.Z*/N^H?hj54#T#N67)r:*G>JRgJ`+tXuM:$;(:B"OT>_S\1hWJLIR-#VC&ZJpd*R.SG:_tj-g-<KAamSZd/#<sT`eZ7MDN5EK3q@lnX8%gSm$7"*<P4?LT=9c[\H$]ZrqVgClI0qNl@Y&9WAaf0eDLpbQ@37,<1\,fmku0Mh-+`\<Q"+%(_U8SL<,Z0$OoPP0"j/efJCS2Y8N+aMe/thbnSaFfBXUC4?>=o5FU)[[_FR=rC8%.E`&FFJ]FBP3D+s)N8R2pILP4hGSH*[$J%MbKhY7s4oAl"t]VPKKJ\#<6qt;l%(W%65i]0ML^]+SM0/]n+<T]:^.P)D%ass2s1Uu8Gd!\*Pq)M!*cG=$uZ"ZbZU'j)+*a=V!h5/2]!n`]o%7ck(;dnJ4:)L1IMO0k7RhLnmQNYkA4MegiCT`[RjW&T;l!csG9%ODk\ODQtgo.h+Y)U!aB#[ek/&,.j;P7f=*&h+;:1Xr*CQn!^BG^5pCH0%`:1877H@d.7V(sSk/XMX_qFTdfe9g%d3fI_Znc4a-eQq8L3sYXdVpqZD]G=/AoE`Q>4>"3o]tnb?R?92+OTS8D42qVb.\BAo;&,I!'KHT//@]6[i*C0k>WDM;"Hqo=3&&rPEl6.E;dse:R#WA5h!)->'Pgqdfpl/ZPN=r+/\8;.15!gb[o:eA3=5akSYt\iRl"(62;4<Jp/-ETVGK5&aHh0RH0c[4XL3M3mFn;;FOAnkd'IVhT:-olD:%,qa,VV8hlu?5',`8KV3Q"*%f.-\Q"_^Xl3CI.Oj3XEh+a'gA<3H0eOG5.BC3.KDY2d8+:;G^3;QV4TjPbK&nT6[XO4X!7C65R]EfpL9!Q=-^)?Kd'ClB6$n"OpS-ZF4:%LQ]_Vs]]P42S_\!^_qYIX>#'J?ZUkK]KMA0lA8m?E/Elkmh8LHFkWm<nq:USlE3h,%uEYa]BJo$FJ6R725_)g_8LkjBfqL,'8]%_Mqn[G\Ckm+4$Hf6mJ^e(MHK9mFFJiM"Za4WH"f]UQ_[e+f6AeQ].cL?CY,js[tPFb@ibm;u"Y=_"7i4F4<u#6ql@0cF!c^n834=_h[.>@eg+.T.K44n=5%:\hAs7pG;*B%cB.QBs]JgQ2X2%Ui1.S[-*H<=W'`>]4uMQ?[q1>F/G$TU=bZ@)ReEXo'A%Z.!YkSIcZW]e+#md"/c=HFl78UC!dliIQ;CL:6mK(#=Qmr"XI?^^J26(QF%Hh=lYRa65f+nF%2kq^][gogTPi3N:IL=$?T-;s4TDLNf)Wn8qBEqo/:(lIO_g@-!@QKAj7ubp9npdKOXq'=u*h*9hV#:/N\$Zq<=eU7NHdfN<2JK.gHP7H;`:%XCIZ$W2Z<k3hRT:/Cin'L*mk~>endstream1808Gau0DD/\/g')ipps'bW=+mHjD/bq7epd=ea`HF2LaL/i)%[Y.dQ7/5^,cW+)2uDq0)=#1\SD$OGVaXF]e8Y3,1Cn+FUd"d2rcakGrH(VL5(jV>FI?#d%#/kL:@BisO1lYWL!A>nPU</&d%?n(n]gUOh_'j][E4,D1:[rc*$=kP;R8>HK#+\G,FHnjNX\H7Ac#DT5,V>r:Ei`Cd_.;CF'H5V;_,2]8$[Dfp%B,+I\Fq,]eBE>E[Mh0e#0c5(fN6tU=uBaVFR8T,I`p)r^mu+=d]ifqY+QadR"_t#jakK>J*q$@Stnd)mlc>IS<rJK`;ctSPd@Xo_aW+?&t5"mHk8Hc/RW88n%*ZRuP\,CU5-`==8u.P"s-?;B(sZH'#"NJFAr'_.P;jKLt$EkNUMLf=o%"[t4:ol#)j="1mRd,0TW$;Qc"T<#'F^"F_^4lbXO1OhQt?5&pq0_n"C74;c!+g"Bd^o`;5'Hn&ujVaBIM7ooSBhjG/b#A$B>lU("ag3>H"EMD!WB>4KlKX^WQd#MokA!JO3o_:8;b':=k&D"R<&`Z[cB`e,VPa+p""!_9H+V*C==bf;>Sh=.m(F&JJFVYNj>ErcSNSjm@7Z7of+j@3qo!Oa:<DMAk+6YX496al5I,,Y?pX8acm#lU;4FqP[d`;5o59(Xqp7L;9)h3$H`e!OZ5C6A^UM19&,ODOb%gBY))?HZmjt#PZ\oMmukS6=kbb.qREjpsg^u6FZr(Z%R)VGnClh5T7Au"VDZVom9(dA;[as[L4;5UF)X_[lc!$WX)W/I945a0"ZePa@ZZ:e4J<D]FM.[L.?1qJpk.="FYhZIjhQEB:0oGAJUfO:M>C=DPE``6TY3s)2!JaUHt.-s/df`iSNa^2iE`r25LCk"@HSEkkbUT5U'75OhKJi)h;@5p:V+W6;I[47c$a.ON5?P3m2`BZgp6n"MKjc.K-3t[LESe7#Pj?G,6b8-8+J(TNJ5C>M!^Q6LeBq`.<'D9?5PN_;^:,dpVn^FK6(f^J@]eJUVO_S=Hr50RXL6M,k]KH6GU[ceNq\WEf_ua\:AO#/QDLkB[,2S5Npl'UW<VlJb:J84hH^.sO!bo!"k$2ht6qIYL8HB^l"fNc3:9qQL;uP`l;Z+d:Kk@g@lD<(`^@$O&09!8CWYW`k7XQfac.Blngr3gl0rZZ)Y-VTmbBsE1c2[16@YXhoLs2V]VXots!s3Vam,mV:\1`Mf@JHoSGrY^3\M#d_jsoslA/38+]!;\=g?d_a=STSEUA[,FNR#XVJ"gXJeY3F6G9.]_:>MbfRKA=b@a1%tfN]9&[1hPb=7NRP?umZXnKibR&T0:Cin@JSR;rdDB=_2a]7N;C??W`7Ieh]W]'JmoYqNdRA#d))?RoJ]^bltLJZHYem(mA;1S"p@6@Ntba*6!HJBU#E4i%X->T#1a/XMX_q,-6m1j\"q3f\HVn,SO+eQq8LSV)?m;f5Q6?Ag*Z4[u^l:J5V5YOUC=Ae;s>EaZG+8$&Yfo!pS?Xod(0,DSP-_NtZoH5@M`(QL\15gjJ*KBJ[oDL?N]PaFXZSrP";^=2c7;qthTYW8uD-Hdu>/\6<J2M:/6[o;(I3=Z$pSYgAc9q&'V)Kqs8"%X!L'^E[VCtZ,Z`t"8->3dPLf+rM*$[8(*?ZoZP]bs_t#47^:n!HHAL8GV21+4TLQ#L"=#&D&?Be!W\#JJcAc!0>u-cp837tUoo7Z>/2m5E%'o\M&?MI*YLqH2\(Y@:"YZ=PA#iSBK&=tMnM!7[3)H&7*d)>8:qnqUN;+/j-faR2"3qsXrjdBb+WHek9LH#1<#*PM0K(T25/Wo&$G4<uGfCMTgV$t71A5C^2`^>7(qSi(iZI,>Cp3Wm!nVGA8)Pr,h':4:%:<Z^)s8X/2X_r?+u6+Rj2mQ^O/UmGlsqW-\Y^1c'5RZ(TI^q',U7Y@;RG6G'4C`PCgn7^)j^^G8eD<]?WU$uB"Ulg-$ACWVl]r<b*;crNr?1G;01[q6HNYWAqOWQd`KiHCo[&Jgb\+S7V;03M>IOqq)%5JGZW2<Hq+\@roPr@6`*k<T"&9>6+l2esd/d*EMe8#4)lpS&9\3==^hYC@+5f&#_BR9Q!lSe&qr$UjYN;hGtSb7?g[,6cgrBE1WdP7D#b!_ndJ"QYD9`RE4+&LVaZi-hnm,&->,biC`1U]T::I"Z#o!t.:]8M`[-W;"[fGm<8q0L\c"I%5H]P1k=P:i&@J_22)9@VC_a^$ts]m3PLjtqr"5rA,ORWfWthUjHLL;A-$-OkMLc8?U0hRVnGkl4/kk[a~>endstream
1809endobj1809endobj
1810% 'R129': class PDFStream 1810% 'R129': class PDFStream
1811129 0 obj1811129 0 obj
1812% page stream1812% page stream
1813<< /Filter [ /ASCII85Decode1813<< /Filter [ /ASCII85Decode
1814 /FlateDecode ]1814 /FlateDecode ]
1815 /Length 1610 >>1815 /Length 1619 >>
1816stream1816stream
1817GauHL>uTcA'RaVKs)@k^8ROZ`SaXqaJaKc!SRG[4A9K%Q9LlAL7%d)R,j1qnrqBa@G"<aoOF`/F_a:pq3]]=rarpo_'tU$b']@dIIeaOAfRQ6h@EWT*hu_1/LBi;L*eZu>D@\eQd-pZ(4WJNfnFMp>M,[D_%#qHH,)6DSl`.s[#8jZbfBcmM$ol3T]$Rc>o_b;OTFUaRfouigV"g.P0q?+Ag;fWe[;WIB,8f4Qi&L0`Q"I_UVj^]a;S.Kg>oTLH&-E?9`"]!KR2Pnbn>M<(U'rABK-;I76'J."q1M0MOFl3;4'Fc,";q7rqW)0s[)HuQ`cRjZc==,L-OGck7QCEa+LRiqFip,OS\U;R.I:&"pXYXMj#nIVN\_:5I+T>f>J&%3mC,16GF$Yq4@HHVkBj)6jKlMn[LU(4H43f]P6\?6p&'#d[Z=rg+j%YuAZHQr+-1LYG5^?q\dH6QaJu8R79)/F:!If=\j`j%'$:juFRaTtZ4g!Fht1-"aLptc[`X!#R%Zdfku"ELJsfHFHN+!YL4V5q'_#@b)Cda'&gq0$iI$K[6`6G*="H/d#0&E=.KsGNb5C)=l1Y&#>Hg1sL=;;iiuY4fD7<lddEc4O:&_p!g'[bt>O_KKd5b2b+B;B/-,h;kGVd4CC76+/]`_S,Hb_C'Z9ARME?l]YE_^,;@Up0?qg:Z#L7)6GUoP6oh/L9i/He+so.QLt9.^FN@]b@IjMh"1ZWkc5T&-VK)R3h@X7.Z<EeM3B;A(35Lb@^BjOn=obf!@,F1blpV9#BCR&sC5XP4J<a>gqpnD@\W+!(Fpn`E0C/Wq=:/2G!&+YfM;4Dku`g8onN0jjA"GH8'*%6eQ3Ca+;iT!\4\Y,@Q_)jd!S>,"\>HdG]Ei`JmN[WF0\/Wg*O7F8U2:r-):q=:PaR\r5.0>3Y?F@&),;*uf>$i>92lk>$]lU%`a2R-C,q,'hEmu+760S7k[Gb^c)4,_?oQ$2B.G`YI)0$0?L?D?6Ha(tBmr`I-AZe'\$ZQ)n#^q#/4rK7k^991(!)&3WgIWQ1_DK+F_)d&j]m7[eRmq>9=qM)9Km@d$=VP'*jZ'"_gS;&)@H\rR"3-[ng!tUEQn)fld\,1MX*M-[7I$%=GS1$B=N6GmZF]W!bc.3rd7l?_.7URIC:9->E+trYg=(uTt7ej!K-AcXeZd+7j-F>1FmL_c_+-ktI<[>XgO1(X8FVOONCiQ(c/u?C4NoUn"N\Q#k#kXcE'8!56We8T$kgh?hFgih]irslbX&s93R]fn;:?=$&,#U.+!tloX)nZ[HJJV]@:2r'`8c#ZOBJ%lLH,]?YmaAkE3jk<,SQdp5g.cphZUY=#8NR]7it^[6cs*4Z//mBNiT82P9]4/2/Ht[u(+&F>>@7W[:P6g7C$jku4#Z8RiE`%R.!Gje1uW?:-*;u#XX[Jr3D9$KL%SS`".?#X`gtg^L-m;t7.'@;MF=)Y[_&VfJ's!(E:6R@jkGtV`8(W>qh51tm.seP8nBWr#gTS:U#?c@np9N-dB0)-GMDN1Admd1E&."53#Q44_$ajIU-!J_of+.f]QeQT`S3]-Dff9hU5d(``cR2Hk]])UMW6%hobrMBK6>)j_1+4pihH~>endstream1817GauHLgMZ%0&:G(NJ!`D6FojspjI;;V&(tj/?!o>M`ooUf(BlBf2Ii1T8]mA8rV$dNagkW4&N>9)L`$[5%u4e0'LI?-U&18%!T"7DVfs;;&I^H$]7(QN+5gUQGjs>D6!2eM@d&"<^E9)d39Teha%JiWWTM,9RU-Uq%M&VRW[<K+kcgZ1ksH<]HuqNl70X=X2.AeY9=+`7k0bq4rZl4[BCN%r^?)ad\%]bYXUS,3L]JhZ9.<C8Z7u!udErO7Y@2Yap<t'XR0H$uS:W)'%Eg1nVB?&MUGH(:ir[2i$DUBmn'&3W0$/bV'u>#DQA[;hM9uUlTA%^rfrrt,cC&C;_RGaY[&TdG\$kh_HT:=#B-Pmf1^'M]RECf&g[=M\b@q@PUNk#R/^mno7;;^f_6:?j6WNIET!&Bbs5'I:2mT*<(#k!peAf]#%mhW.q=.*F-3+u+2I(P=_^2,sBPO]-nMPp;.%rcp5Za":Vq^/5OWWs%_'a^3dJ-usAgiaeH&P]I_+Z:_^3p5(_gjRB%,drr/WAc-86h*"K_%'s9]qqI2_6cD-DiP<;$tP"SbZL!du+H[G9?/]RGkO8f!pJ>ApaL%b7FFebdtdnG@%m/I]s>hs'Tq?Q$#V4'hM,>NW\-in=l?5:3WT9Y+aZ])'N.R"IV95O?g@P.8V`WMP5FS,>Z4oD#j.O%eOqSiQ47bF@stUFP6sH-B5qIh48T<'?#ma6>gH[<\m#dAJW<e(eDY1oPc:HT*p93VP9oDNG`Y>iNS_4[^EprHsGbi@G/6)QKO*fA,Q:Zi]/HGY2Canl$UUseA[Y'nUaW&@T[?!l$IJ%gNH*U$I5gfr3mNN7n5g4H?Z,DQ:R-XQC+:;Qfu_P!(JXig2*92Z%1JUiOdq0jjEV"A$M<<1X@<bm%g:M7-H:/C?fJ($DjipjTri1QqM;\?<9XKYtI@/V))fC.I?Cg(h[qn?Y@7I.Ige>%;@#fEtZ6b(@HLF4)nmT)X!Fcb#1%OjC,VT*b809:Lm5H5%1sfO&t]:o!+=^If,WY32)]OQ562h+JckZ-]JF::uUo/<u4/?#M7_(JnX5mP'/I2/5NXM&p;+EI-.+l-)RE"UoBLM%\/4oL`;3djZ%NOcN4W;O(ZX*Q9.0-%o9NZZ-'%T/gr_dN5ClDC=XM@SS3d>Tp\U/,$@^2gZjd3`(N8Y29K,NfWBFHW^%io[:E=Kd)hMQp"p3FW!^OJr$I<^fEQ)kH!"1C]je%3I.KoJ4Qf,XOlmGM#J*/0RP5n`C7mVFpX/!1NF:OYlC;sMT61gj;?(bXS@Mmh8OP%_Cd=lYr!op*G2NOkM/tcf;j0C[,?bJ`*8[n^C:j,AW6T7h[.T5E7h)hLpX/kGofLi'^'_P29#3"Jera#\bB&6:5"Z1A[3J;hS6B;n_U!hR_hh^/8,C#5R*\i2WWHq(E3Cj.=qRO`PkL>_QKq`iejl\K'UiV;GL<!<S2/&8C+%W",l'tPC[U#jU(2j-HWLp3Di/EU*^h\AWQJJ!h>T`^WQYT&L@`U_.(E:?E81&fg"g&o%skqg>p%5bi+23;Bf<f?JfT&1Or::mD*Ob"4=hl*TneRs"6Za(j)B-R\L7sdIc'gGDBW5f5oAJ52]Nn:#Ni0/I/~>endstream
1818endobj1818endobj
1819% 'R130': class PDFStream 1819% 'R130': class PDFStream
1820130 0 obj1820130 0 obj
1821% page stream1821% page stream
1822<< /Filter [ /ASCII85Decode1822<< /Filter [ /ASCII85Decode
1823 /FlateDecode ]1823 /FlateDecode ]
1824 /Length 1667 >>1824 /Length 1847 >>
1825stream1825stream
1826Gau0DmrRJH&H/2gr"&\$F%OOmC]cS^]?[4_hFuZtS#1;)+.29uHa.^u-!-6s\A,a.),/s,#V!;k>VOl[qt0TaKF^6BmCRk3'&\O"F?fTZ#;Da#htQt$^4m`MV^MM7T(pLT7PR=0TbkbER+Ac;4nhKYV^E1oDe"MU/h(+#O^,Q?7QXON8S&5eor<,"U$sODE]O)WM1JR%Fb/^0rX@h*?/jbtT<7bbZdRU02Lc!]cfG[Brc*rp,,IulMMZ\W]d[Pug^jg#73Uh4C5ki<OcW,-NN*:&K:@polt:cg838NOH'/9]OQ)3,9S&*:mWFBBVSqo67'Bd=HgBu$?>ij$2`D(V;O,HC9Q-;-:Y+jN9t^XbD7QqMRHhI8R+@bjheaOh9KrpihXJna^0TnR)36Zfgg[*VUG/-MbS7+63j=in!43[PJ^N?XQ!mq5)\N2:2jSmoh/\r62Wl:M!#$fGm#M'@d54mWaWN,<7#UQ.OrD1(VlYuOEn\Jj%LQJT)DF0(R_5r-$Dcrpc=r,sTPF#Jn</C[UWS^qK_&+![395J;E@(mXJO;IaO'jBo/53bZcW"H.Jk0GlkUi]H>,_m[Bf7bRYV0j"q+SOS-a6;/1!]p/.cpK.b#9;Elouh,Apo3Ou4X?.#^T\1rpXP.B&&jHWsp0pCqkoM,_(:Tj-FDjUc4J9;U^69oB00@\AgKH;-Zh!MuX6Pg5#m(%%<Nhck<js&Lr&0BtM`QqYd^(:+K5pmm+700s4_&4XR%\J3_P?AG=a89H"D]ug(faU^`/\jJ3,_l"f17JnPtXf\[\W/@KeJKtnr0&Tc*8a>dQ.a`eimRH$[W83B<O/-i['Zo'J<WEm=Y=QrDk_'!i<D%,VltKpra@IKa#7UiR-qB!W'@YArjCJZis&MgM'tF3-6e(B=aW3!N=M5TPd8UXB6;p"i%8>']H^L>8E*OXqRC4\I$\R_];TRp:c8DcJUOLfqdBYB&aP"7\rr+'[lPKQt7Bia`CY#T.UnZ)0F^$128dnLO*V*5DF2>W$-=9@#DI-U&Hu-nho+F6,o0r8VPi@[W1&_?RVEV48^]3p!qAnY:<:@ESq0_TBD<s(Ma;_]hr'FlamBl_=gUajnjGsd0cK?U(/<?b&rb-QOF<RbbD>u'XCOTn*4Qujf*NVt>S%#g+1F:5aPA6qq^a_o67Jb]AdRIHRft6>Vg:>L196^!bO*rZ@3r]Lf8V-75r1+t<m@nl'Hc[<=?Xt]<9NtbcnQU#Q8?4q]PB8a>Jc?(gUup6$>5#65%M'W^:U@:!0foMH2*pV/F:,m,2k])r-`iUG43TX0'pd)O[Tah?H4BUheVanRn^C`;cKINWb+pYhM&M_V'.nM/jEr>6E"j9Egq=+JVch1S&OIjZSsm:o3SJbaO.J%_%bL9cL(`m@I;V]32#32^W1g!H'chaqf2Q0CIZ][U_8Os'\dNiqZ;[;`\Y,G>@Q0f2Hj0,L3$*2Vl")M"IXFi0I<#;Z_H653H]'kBNZa@CBtZ0r,Dc3"@(=?bY?pQA_-h@YX1`>(oD2:tdnJOu/Xp*AfS>MC70,eu1N9rrq<TtB.W`k3E-_$ggu=7sSk(al?]S7B3>)c*_p'%Q?bV&nVmc2"[Ll"dao,g[$%mbs4*&0'mhP?47_4,q?GiI""M5$R>phG(ZF9%Qe!#7^qMXkn~>endstream1826Gb!#\>Ar7S(jupVs7!]19f?(]jI=r3"0uG@[KTm$H,(I0%(&FWCa;n).6Ht$h]_)SPW!\),f"_ID2$m/n=8t,OBVE"qL=^!kbfR]5DBkA1n7Cp#s'oUU7[4]8"Yj'_U[!+A*S8a5o^DESFMYDrfNcn+2L4PZ.Z!_%XTo]H$asPm6pP4Bq)AI:o':(QU/IS9T;:,`)<bd1?58hr'\Hk^#M?UT*Of%-b4G-Sc:U%/akppreE:)3JYeB/sr.b'9)`daD410/BcP[:hdEtA/-C_)QQM!`p!9iU\gHDI&%3TbX=32@4:4N+aH[HY2eB9fW7teDGpt$A[",.<YVplq0dIhq*aJ;=j,90VV.a?#'#oHQXZ;!m+ruEMi8NPO8dsf#jUiiK0^%hl9:.UNn4m8lOhqA6?C&@21T\H=TRa-5nXaf2Dce9^BrMX#t]&#!cHjSp_!-&do<Z-OOFCgR8V=JnUFXs]Kf/Vdu$CM`:"%E3;NGN"ijPm>MRlidZfQBm#3SJ^FCllNpLF&E'u2(V0m&I%\n*JB:PfSoA&,=9]5,l3Ws-)e>NdL\c&'P[U>.k7]0m,p7,@;bWloUCeQ.OG+XC]J-"M?WCg>JC!VU3LhNY@:1hKQDU*Xln1FS`@;3rKD,<R9N/K6d,4i&fM'OGIA'HenLZ&sp8t-8#rV6dR+0k@G'O$LL3*QFr9:9hI)[)$'E!sj.kKLPsC5.*E\3_%#Q8ri2XX^ah%4;1>O(s)/#"]O5QRT'\'cKBRYu."WfNa9_?+E$"]s5eL\:C()</shn?;*qD?Vifs91C:`B9NPUKoKZ"Q`.0JJ<+9qT$-AR<Wb1caSj#L2*0P<[oRmdg=ndU77$++EkB-CBJD+[V#b]^dPU!W.#jR8UW/B5rPl6]:_Ykc9o+4Mng-,ICP&@`!5^kA6ie_CBbD7f.0L9cplnl-Vk@[V5m>*EP_[+ke8AXpGZ2k\4\+SOM9Gi_"k<AdUdjOmXJq\hptVSYagIM]/<*DR\/UubF$_4B1ZPE89$?n^,ZDhP65[F2&%0D:25r?(Bu]9fo_3Ql5JIWa0;H*&>bb][<,$U&?);2>K#EPbo1stMRJ>bLbZ\WHo#cp]qsE<COjcg/^DN*r9"m#:jSt;nTg=J)qnI'PhU0R$ia&n$==aNh`]gX-Ff@C`?U2'HFikdJ[Z*>+3eR.b7JeN-+0$.<HD`\-HI(M1:48>k=5qf]RA<-A41Q-cb)@iB1smeVl=$[",?UX9,/KmT)6^OrWk2KK0tuXqF`\/nh9L0jGqo41Tp(FR0&YW?6ak2'7ILDlds>&'H)-@nl1c1b6X&g&Fn+9R7,:r&-,aY$Yj=e%C`V@6*_2pD1"Uqih7[)ap'fsFc@FW$mbo):O,+`#C0II!=NRQ8Y)V',5-3IXlYmJ$Nn*=r_c3WK56Y"d'%8[ProeHJ(qnc6cG+.J<o%SE&-0N\02alId#>ScZ59*MGW;&a#tf*hlr,4\DYIIGW*,*Y:D6_i$D1>=+$noPM=SmX@'6Q*Q"/IiQFk%Koj4?e\iB+,$@LM39/Ln5iqDs>M>I0PW4?eu3=lZZUAb\]kk&5Ui+g$\4hI"JmH>ihm<R6P[mTsiMb+UHA,Fmh%YjKFAiE&D?s"mNZOa$Sn;JB*a38e=lJPmJr+b1Xk&)j"R-V#4%/h75hme)Z]8@BVN:-m9i7LmkQOG*iqe?3@^j8%V<$pE)9Z7tZH^3hS-:n/j>Q"pZp[DK9rJ:=&d6(KlNr(S#Bm[h=FFO/rh=(_?&"1qui-V@`Xa\XcG'e?N&&3]@;iY,mB%*1h=ZI"nK/n'!lkk.hD"Uq#J(<=C1&=5_/[^$b4h6;9V"GjK3^3BN:2Ypq~>endstream
1827endobj1827endobj
1828% 'R131': class PDFStream 1828% 'R131': class PDFStream
1829131 0 obj1829131 0 obj
@@ -1839,9 +1839,9 @@
1839% page stream1839% page stream
1840<< /Filter [ /ASCII85Decode1840<< /Filter [ /ASCII85Decode
1841 /FlateDecode ]1841 /FlateDecode ]
1842 /Length 1110 >>1842 /Length 1172 >>
1843stream1843stream
1844Gau0Bd;I\s'R_puIlMd'l416PagNJ(a?qk%5QPBb)?JS[?YGS-fgqi0;K_s4]9FPbDUZ**RMZ;]RJ5RUF7-SL!1uG@q`cT^hbq,d1I)Kqbn814):Bi18;Dgn_a/7V2GOh0kFS:s&rIP:?ECNTPqJK4K!1PR_h$\teXPNJ&pA9D#[W+iU^Agh=!2M/98mii(ZPkSSAQgeKrf&mD,<%#I>.;<dU-3$It*)^k'Q'`=Ss5_r*(RSj=nHJiepMgX,K^H@:VcgO28h<O-,F<`t2bA+'uX+**kPuAj;?UV7[H^[MpeWZ6DDj"]rQ+/'G"noZC^GE9%=pH&oiNHnTdUo);LThps=l*HA^j`>Q[i34W9i@Ot&T[m%U\2?2;G$X$W+-Op=hi?3G/+PfYBN)`sf1e-sEfn`fc0,h0f\6,0f@>SttYZD8l_SU0oG*:T3<:1h(5Zb`tT2Zeh>1oiP[.OQeYWF!X\%6rlPpi)-hD@Hkb.fH<3^NP-ZV!oD-b9/e9&*UIXT:d8G+]$S"9ND[p;jWk>>C/^nhm=JUU@&e+_62>DUSOe]&.6k!rmjV"e#+9:+`b<!U95H.J^p/@Sp^th&Wg>ak,0$@Kb(7bSSl+9A3.=L3pX\q=:%$o0mo7?V-E7(Hn]fXbeo&XD9aIQp%;;!6`&38u#@XBuk8$X*VWP^QWf=j6t%sA;*X,ktP*f"CrW"bIZ?8ELg&]cUikHG8\G-nnaQb%PY?5*VEU%=2A&%_^Ah9k,47Q?T*V'PI@ZO)7"tnb4#"r0gaYU@9Ug(S*J'.W`57Q=eH'jA:J?Y'kFGAN9`fAGHUDV"raPUh,6Y<\9Qb@0p8V'i_YYuCe.K$<no]gNjn]<dDdT,Z]AV<@(2D%[,\5`U%01TOd"LfDXR2S>RNTc.b_[B2gc*'q[RGEKb=1QdF@OST';2AHML,.U!C/^m'.AQ[DQhNZr?6OkPF:(A=6K<4MY!EKps:UgFHO]?/U`N`$+-Zim>pQB(TEZ9%tXrj*LA.mmSk9Ruk[iO.p99m*Ybb3mFAQ*!KPn2:"4'b*cj9Eo+(G8Y53D4?*J0jJo0q`bi$YG6Mk[b(WFF7?NeJ4]=g#b"+J?YP*t7i'5J!kS!~>endstream1844Gau0BhiHJN&:R./J!bS]QC]3h!r5-_IFpXSUm"hbg5U4Kckd?Wi,3#%[aUK@ral4'@ClbUFh;<!(shB5n!e58+/\i(g\7cPpcX>grq+#;+O.`pHZM_riE\JaHl3FlrSBMbGSYYtA<C9DE:@UV7'98+S.g:l$l]\Rm8gP7%M5k&Rml6_KNR4O0dLj/i[&]`#kia&>f.$6i&"tuX=C4#:bfG)%I%LrIg,];2m_9G"-!<HQuV!cE2BY<;cgK;@;7C0D/`'f!@sI!5cpP-p<iNU]<m3g8jE5MC_1j=V8Z2\.\fVR+"QFs#:j%/^:D`IAI7kTaGM/`!uo-m%+uKm(rR9^:TrZGc>FPIaYTaVdX*7XXaC[cDKeRQV8@Up#@%WE7Q]b.`[.+ZJuBG;o1l/!/S<l3--5sf)h)/!9Q\31rPBGlU1ek`Su8%OL4@3d"0&Mu-Bn^:bQI,"Y[9?;6H0_@"OpKA0!c.5G[AmC1SIp=Do!UW0S-@/@4ba=R#U0E"$3>5I39P<Ytl&=L/,"b'^^1ugqkp8.,%su;.UeThD@Hlb!/O94$iYNZV(#!s*'FWdibm15`#]L5m8S9XC5>SN@nF1GI-9@Vcdkq:i7()JbOBQpOM\@8u'2:^qBr?pOT+U>+kpfqEl_-`8YC&1A#J%>__h"m^*hi,'eb86LAlQj`G7apZnl\F-;2rGe%0YP(a]8WCUT^22eOT)AgU<e%&,0euUbhTtfTKiOVlL@A?'63nWs5kQS>Fd_O)</dVLeA7\mYgGZ3uMK"ReSur\r5k&6IpC=F1cA?ilbA7,/oDUOd6KVo.M(e23a[t7=a:-dS54ZB.3(Auk&uMK6i(b;;6C1m'bQ=;B8G8BR4+YsD5[5$BY>ae7["3eienm)b_gD)oO('D=!Q@?`&oEG':b#3M_<YsG-/'3qOaW$3$dD.%d>kOS6K^?7L/)L0Uq,*(F!^=-;HU_=)Ep6WVj)"/KGEY8_:7gk:Nsg+&RIYaI]>3lC3Sm\F6tYWSp*j+a1Zr4%p<MO[84$W4sS@gT=3(%62-%WO@C3T]NFN<(eeQ6;,l8Z>IK-Qj^7LSjMK8s4G5nST&UJY*/;iqL1r@L[dko>YORpboa9f.@-]$W[6*1$"dT](1G=PgYl.`+pIE7-M=3kF)6geQ7S?.f8)HgZ_f5)u@%[_l~>endstream
1845endobj1845endobj
1846% 'R133': class PDFStream 1846% 'R133': class PDFStream
1847133 0 obj1847133 0 obj
@@ -1911,342 +1911,342 @@
1911% page stream1911% page stream
1912<< /Filter [ /ASCII85Decode1912<< /Filter [ /ASCII85Decode
1913 /FlateDecode ]1913 /FlateDecode ]
1914 /Length 2014 >>1914 /Length 1981 >>
1915stream1915stream
1916Gau/XCN%rcn9]]`LP(AV8J0.3j4MWm#>;[@/!(HJCMX+8I@qiXi_5IU7E+qKrU-V^'.7XJc>dC[hKM*=*ISdaTC8@[#4Qp>K52S,&M.D\a5.XK2t2!1Gjs&<JR?f"B.t?%]\2Y!L-,r'F=<=m*hWMJOa.:l%-<IFP*7gNBh-cQDce--ILM.L@I_L^s4)N>BK7)Y_ck6A42YQF11i,!m[.EYC@u28g,#+Yeeu/rg,G2V3=oh4fK0!1JbEC"UU+Cpi0UJ;B/#oN]htbX\uWPB]KELtP<FKPDC%MuTTG>k"bPn*[6d."ErM3%>Zc!lkPk%^2Uq6t6Ui;"!]n>$&]\9:,T;?Q?^l(<f8@4qdA[204(_Yc4;J8=BE]qW<\Sp'NKl'aU^0(QPdgRmND>92]d@&4/*fiR"DW4*gjgB$Cl6GMj:F]f>@#%!.I0[QQrt/>YUgs^&]',$%(?g7@CbD*\;O$fW4\GM.!#_3,X-=>lo^9.1dc!$,-QT=%hTOI*Ngf@'[ap0(I?Wl%lV;%#Y7dW.KfEA@jg!g_F&')XXqAWrc*;6QX\LT-WDLPLpi=k->/ef4LteN_=Ke!(uV,!JX0/k'/`Mr:08i3R():R7Mg_1<5ab1MRN_Q0IpI.eSfja=(mT@7?ViXM`!F&H23'A[)bTZf!\3i["L_:(-Ek"0d*,k`oj^d=XN3Q5YH];\>2$(pN5l7p_O75B(iMFU")qnD+YrpPL=;!5.R3X=LmW)3qNKKn-T)9oY$[o2s6do9j75hH;4NrE-4__QR!@LpYMQ)\VY#g\9:6\!U&<0njF3qK->:?0agYHHSUUH%6dMkV!JQ0@aKs)HOs>iEf^=(9"H.u7iCjP%d5&MUOtS2bTtsR;ClD)Q[&mN*G1X3KrHtq^[*C^9<-S!]q55lrfJ:DH?:,Te"]t_\CPnrGBU>i,#"E(W9?rGR!o<MU#dSJ0>fr:7@/WJO2[#.J_YqMhO<-)LW(LDl+H0eeH7@88SY:BPU7##mfhEKSTR@dor2%P07)"6?U>dk=.=b**$S]W*6Xi!)19d32d!JjA<-Qb85QEIXX$bHE5GtY:=Ou+Nq#WYD8m8_n:5kZc9,\k+'#mHW[63$/X>>.0N^1$O@9^siI\)f-.[V;QV-!WG,fL\gSpXP6GF+1_FC"0eR_epK0i+e"l=Np_t*"-0(6=c@I)TS+Yla/!PHg6&_npu4b.>/f-nF6N7;&G8(0.IL*n1Ch8P2\_UF=X<$#*L78?jnm=FRO%^=R3DoOO+_q_<S>U.,sA?BSL'fgL#ZRECrlSXNV$Pg8@8j/T;T7k81C7*\?r<NGF<Z07E2C<2j"n![R5BZk:gSRX(77OMAp@d9"T]OSEhmd)J:LND#jkK?nP2n\nD,GbBbHJGPmp,mlREKL?/@466m(^Q[<jV3N\L/6m0&o.?/uQ:DS@!LK9J9(X2`[+DJ;+c;EQ-ECDXitJhE\g;Tnik!bKkq7<EfsenRqlPGWPYTZRInf1DH:H#XsBangNZV5(QKWY[&<"Al]rJhWS`L3Lr"84;_%a7nQ.E_]n,#a1*ZQ-dHlJh/C;Pif1^$6k!_/)m!7h*>2Gh4r9FS0obYNak+PnI-OH"7ca`]Ki'[.#"Ge8*i)t3JLNoRE"B1m)9aZ0[i=^(e_M-gKkYm>'tPC2X=WO;f27+a%g"4*WIbD`/h@c`QI%NL/mVS2M0u5H?aW:E/fQa[53`?#=Q*?bEu==2eIDDOBf@C^3MUTe"Ic4$LQUSXccHZR"gXSOGlEN)r]H$^bJLWFC5R3J$DOaeleFh@=H`.3'T?$P.W^=32m-FND:HY%:)#])T$==hOA>c+kLC5Ym5660n(:9HIuV(6A_OX5$f8-B&lf^SC%6R;ZmND3r$hD.GOHU'\+kt\dh,:"cc\s6RYD,DD<-ETE-:mb54BBu;BbLdmVn5B^,J&8S*\;]FAU*GG$X0N*E_>MLSI:>Ot,#Z-#3]tUJl(fFlFm<KTA2%7l++(_&YKS4&pJQ&M)`@cf+BO5CbQ\#Q~>endstream1916Gau0CD/\/e&H6"/s5Dn0=Am)Cjg_S-`PL92fa=NDf,DPWGonGkOuQC97T+BB?b\\feVVbX6g$Ea`Hsh@Si_W[`P9c,ir\07)CF&ZKJQ`.&C,ngXDd%YqVd(A*^0iKhSg*Co8@"eI(D]`:RZTmaW<W2"_">#*7b;YS"V14DaE)PY,1![890%alT\hVf^&RVIrAIMT*<]pb+lG#VqMj/3M*lpL>?W&=Oq)V^lkcOkoS*`ON^lNaiptEs6c3G6drC;IkVlq@D97MN@td$G@ic]Ndl.`@,5/[1PdM0\Qe+FlA\iS&MqVfF(L%=+8@>@S@3<]3FF7KKZZQX\>mskS;'^i;#'?s%V9E(kQJRJ&Cq6<1?#3/BL"(U(.H(/;B$ud'M&f>T#p]s]oQKV!aUs?PE#=E52,:5%`/4(9J/hDFE.^4KtXWsa-?0J(X-]r&ff(cHU<(r!%-HVW,gZd7GMNf/<k"ZG/h2225uZ8&c5,JVT;RQF"")^5!^G_;TE!6+D%qOfOp<=q1G5W3GrA@9%Ad1D/kYSnED)PYuZln:4IV=1R;M)KdThNX+ZLn@]!PF$9YkXXrmuO\=DJd%$?iI:D5<S&5>,27;R<keWMF,="</u$H7>r.[Vf+\_=YMe1:12kUOa\r)Lj5a'RXG2_Ai^7-TH-;9p*0Csd*s'GCP*'mrHNPSHOQ-a][49UF7@jfe[?MSG9NC?DZ'G"PHp^K(rOG^I3ZqC#GE8u."UXaW*C<u[$bPeMV9b2mBVlG[Eli"qdIO79dE+12/P"!<otWd"*UV_m='D6N0_C[lH)mlU*u&\r-->(>rSOAE]>MG.#=7j3('.>r!4)fgtI3dR5haOgmCc")p6rcrGR2ka6r(M1WH'5lWZ/j_:=r[3_oN4VZAGj/^@eJiqPm#%c%f;=Ckh%snPeVAK.df2HoMIT)A5lc%QN+rSjNNdDAU6Q@2c:l,EG<3PQ`@Vie?LJsNpqUDtPb?3*oqKOCRWp\>REJ*V;2NItUJRm$+DPN!CMlt<aOFr=C$0Rm;ut7A&`#Sg_0C>2D1Wku-K0'(FHLN1;54MDV^$'j*1of\kBocsCH$/g&c-b6O)qMidP*?LKAs%AMIhSg6*,upRB&E"]$%K,aP7HggWCWsiBrnr["h9UgFIrGqNhccN]7%g[1EC6hbSD^9%[ja-2@5U)c]3clm"]'$_*?P\bs76M#57?CJeIW:>gi/N8S;h)?=$;]LE(%&Yp2>34aj40g$,8:)>_K_5U@eV*&Z!.SJ^W\(WT/,A_)d>B$\BfESILCD?Q8]N(Msb&Zr799Ro./4iiFWRs.LCAf.4,W[i&_p#i4HanW9N<=gR`Y=uA^k8_,g]"hrVh*QI;:+18HN2cD>FUgpJ)uE5HNmFKXm\0G<$^?LlFuh1;ILe-Ic]<h.pP$H:C;ljamjH=T<7<C0>0k0*"!anlt^@7a_Q7blLMg_p&doMDJ7+R)co`#iAEfqYA_4B4;Op3@en,b^?smPT<aJQTsI0Aqe?3e"b`Wh\s`poo?-46Eg`N8a"u@d:-UNGLU1CfV66=qFM?P!LGpSQ6_`V@i&E@b.]s$2Ic*BS7eh';>^ZL/(s]QKLg.;^M$L92j^`X&mg(oCIpl)#L8.msa'E6jNN\Jl>9#^29.;SqN!(1%@[t9W_LK&DINgto^h6cXf+$)0HtHqQ2Z&LAKKluo3(XB"<*;3aH'Zi4GUZoYg(X/[kF_E@D(Q\k+Q)DfA(]dC"=oi\+ghdVXD9b-+??3rp^Fa2I701f?ruEE7"B*NTj+e>Xj9WUkB-iII*842$-*DmHr;@$E.g]^:$N(YQQtC@m2`+YcRbagP'G%8<f;I"5)4+Bhg];+g[q-[(,K&TI9OB[@ng>?&CTF>#bJ_X"n-\n-a$oB<'?>7:W),Mr5lpON^8kkbjETrdU6D@["I1YW(GP%_cjEt-aWDP[d`RN4ULQf%*k/Pn,eOJakWA3M]*2*DFG$G+8c66bMU8~>endstream
1917endobj1917endobj
1918% 'R141': class PDFStream 1918% 'R141': class PDFStream
1919141 0 obj1919141 0 obj
1920% page stream1920% page stream
1921<< /Filter [ /ASCII85Decode1921<< /Filter [ /ASCII85Decode
1922 /FlateDecode ]1922 /FlateDecode ]
1923 /Length 2096 >>1923 /Length 2111 >>
1924stream1924stream
1925Gau`UD/\/e&H3^ns5C[#8;9O=j>XV<5,@G#V9QTQ2:)d<0[LFYZ_9pTUuHX6IWr/0kLFLT0blA\R62N4hECTQ*C:/6L&NkW!8\1DQOb6m&I^H$4$a++=7GPFnDM@G6!038a3a.ZJmLQqER*OZ:Y1>6g(_akSmF4j%M)`lW6#P\csSZ5h1IEJ#&(T`7J[SE)K?>;&k@Ju3Fmm+"]l1MaV0dCDI=[Dp_\bC@JKG1'L&F6.oZjg&3g+`$H;BM)3_oud+R3Q"jW8cN7jau3M:A[g8FNa4f?*aSRJs;$&=up`HfU)^obKJauXPr]fBD-+k+S^('!h>_^=*5p5D2KgIk&cj*0L<$OagS/i-lCpg+$hflP2md$4dXSO5g-=SPJ*0cILG</IXaLP.)nEMtDii&!')Kq(JEfE=f/n_C?hD#LZt`dDZm8WbNaI5#m.Dd@X0[OOqW_/Tr+1BWP!8<,T+1ns5/F+F7TIHrIXMDC%r.Hr*<D16A+17TI,0>R(?1CQdPPS4ZD:UmgV9EU63k`ea.@Iafa5&je0-"/RkMAF&,i_)0gRu/c7QT--%`]>2NJ,tIEhNF@3jlhjdQKUr<KN)DmlQ]LL98!uhs+CO87MdaE\/&C,UFV:8@1:I4aUIC\GFgpIN:QG`B.4[?K6YiZC]U@OV-itBqP?<,&\<C;74E?Kn^G_p`RW'=s-r%-bPc-D6*peA%"d>oKQ*oD'26R5M*LaA.RkBY0"&)r6udeqQB]Hak1X2S'oNX8?qP-gnY&i#8L`jJOu]5d$<Xo[5NqGR<_ASoR]Bi_p7naW[;k+2MTAs>;Opc$msb;$e-Of\\6a?RgYYA?&I^M2%]knUWr/s+&sBK.'dQZVQ!3c#h8&qp0Ggr=5q]!I_L/2!bJbJLW2>_2_WhM!/l^C4aFn"8VA,*._oeL!5LL#t4Fk`pJ!OX[I:dBT$!$8J$69luX@to$^dhE\bWPlJ*o%-`BS(WOI(;`G5o5XK<ePNEgqu/7gg*Q"e.CqUI?oK;:h8%]cW]j=-edh*46;>-Xmih'='2B,8gXI%W(phO.'[5(^lu$rMTLqen?B/7bb;.7S4]3erLD)mk-*[G^p2Z!Y^A7?p)Y'G&F,a_h6g@[dtr:j)X!-2F-I(^a)YB\_.2Pi.&m=PK;pr!4C%;V]=j!pZR+2O3q1cB'@K6j!ri57EKQ=<9#SS4d/*cf[aXMXSd?q;+o5l0pQkT]j2'kT]mG.\rQaPVr@0uI-kItXOF"btHrg:ZD6\*u'*^+ee-Pfl&dKXn;$VD;4@>*"H;g]7BVbL'!e='oMFnN7XE=0\,?Z&lE9Z:]l%tc*.%26b(6SVPp!lbbs1P!P[,c!AktaCKUlKAR*6EQFIoO:(?dKj;$f8kolV$fK2#7]m*O?jD=-gr"k31rP::&-e:V/L:PDo9(2$&`N`#Z03E.7qf(&tPr<\'&@d+r:(%loqd0r%Ak,BZ5JI5=atLSsuT"0#1Ha,NAUQ[9RYp:q&<[m+k=I_u6]H!\'`K%92TOpOf6U./<ZNbr0&?q>ZR"6Q(=Jk_qkOO^<;G3g.ule&T/1,4;VC+OSB]>ZYH3[fG'eTROXkA+PZhP+.WNT!u8TVt]=bcW@/O>8C"[M_EG)&=)DN''GXs#h</RfKjti2DA$'iHfE_Te9VD(sk03PHi/Xkm+LE@Wk=_\8%5pc=r<#eMOYi?6p.E1@5S2f7c`@/!`-XX20.mWP$IN9Qr'-"8.D$I!4T2K5sU[%-)M2a:UT+EZ7'4h56@g58<D6sZ8qM8(I,dmKtMO,D+p!(2q?gfAH-b0cJL@uooWmlBu0Xd)NC\d:qG5>1XeU%l+?Ja2Sh[0_2Z;LVE9BWX)sURb#ahmC,j&2dcN3m#6Q,?&2[PeVE8N4'uTr66':<6JPVG:DR\l]DBXMY)8-.f0-rF;EAK,ZF+i4]8DadPZ?HfSbk$*S[M_HJSd`?Z-#D:B55;>Q-"#W;-JP_:nhnqL_u(TaO@tGc?\7@O!NE^GI,(d.DtDSQ6U"g>1Uq)ogWoC_T^`4tZ#*\f)_(h]e+F[%q<Wf@LoEFJF!jot@p4SV42-(5u^-YXb$'Su%IMd3;WP-Td+$KDtrB_T,(~>endstream1925Gau`TD/\/e&H3^ns5C[#8;9O=jS'GcOL?[*2X@["5W0b#5YEJmNC9cl(!$4E];$[eUoBn%%]05$,*U(-_rpHZ@gF[_$2nLA!5'2c0CM76,8d6gG(L3_0&bF0iPE"@K<QEO+$d"M#(sa25][DGI_%;%C/YE$0Y%fc*$2Kb:m2n@OMPO8]17%d?pRHX@DFB%JcRNDo]G9QXs^0`:!b"R$\bJ8DB]d.75%VC3N*aV.YH6,X?bll!pIesf?t_XkUVU@L*NASHo]96(s>mQJZ3aT[8HRd_Q?cDS3crK2n;n$ce)>PXTP+HN*8IY:LGC7]K[&#`'0^+p7)3@4!SPj@YC3qKpZ8bH\/GdFmNFTF1fIYWg3H*s2?S-VV3<hN'G#1)b9M[GN+Ako$U[b;\2Us*WtfAk=ukn.gm-k#q`CNP=?3@Cn7P7=4+RuFKAu*aq=\Le+-Q%1J!Il6:q*sN$p()0C-rn0eIF6.?An]E9D.FH#pDD9<s,3)+;bSnf^N/OcU1"Djge#YO$%C3G6Vm/+T3+&pa'Ve%)+XdU<.\9,'d3W0EK+.#cPW@:fQ1,!*[_4\U;*g*^_fX`Bf3nQ@Ee-8J<[,u$q,Z-H:,#bKD4fBfA8)7egf`Oa2*7Og=foa.^!`%m[>re6_aUC3G%>YD8Sd1roh)M;1X$Nk_Q(#p%M31BmF/tg+2d!BRp[t)A__n!B#cHM%H;](_Q\!J($Da/W^3FZ<c5U#R!r=Rg)^Y7mMGM!Bd4!^5&d!IUk>U\j4aRe)A5Pq6+`^h5=g0-LKXq6U>#IDK-D2:a%P%JWd;VD^Q<'hfi$p?+pP?MgS[bDl,]tHeV_(nN&.u_18::[rUhuS_"\MPQmY*eg0ruBYogG4%;mRCja!XrQUG^`Ai"NOMcf%LI&X1o;n;*TjX"m$c85r$*t?6J6pngUo%@[?8EaZF%3AiVJXobf2#.dI>8;McB*bX^o+(%^]KerHIeJ5=*J.oKuO=VuCF/u]J80/-@rJh2E_U(e;ipj,6oAY*R+50n\GVAquV:qk[Xk70rBrm*;dGEiQ87T:VuZ]pslANDpM6jd>VM0=3_^#k3]>1%=]<)fpI9#^cp\5lNg.&gqm^se/$W[T>2cs]j==?p)_30uEkq`.e!c!S4mJeOO]@.S!ASJT?aKiC8)4tUPlg;A>NNH<.U3=^cHWT4h"oE>%:MlIoIT^!N@*c?-PlFm8uCe6Ll-D%^\1A=V9JH,L*PhEul74`6YdJohOgV`IN,@N)dS3EAC^*>i/60n?JIK=hBh<,IKL\SM.O_E^%Y,?m8]*3_(LQt7#q!jFadsaaP?n<jC619WU:_T/P*,-Z<\N["ni$6N<9i<l"SUImmc,0N6*8E#,p!TIco1F?Aq(ECgh5'W!l_u($^:(9N[55u5q<#c'`&IInOp6>#>O<9?Ms".Xlr@cl*T_I%IWAdu:8Ts?eGhC?G'!In\&&rE&V$a6i7(QX$$uaJ-U:l*++(\,;+-&n5(e?<<0H?*?#gg^HSXt-MV:9UeTVp6Q0LFfL*5==@6]-j]KgW:,@Ypm"n'j6FDh>`gY6?f0XZ]TCRl]XJk^f)nO60>D[74=71MXfLFUr5Dm$/TZ_l1s!gD-dm!<<"MiXd/pk;`&GtOYm&]8:;L2B#,'0V&D,$d">VPldQF\]0c&b6C99L06](g6n=I"6&>C.3]LKsN@/1('f>#L/IKI)G+9BkW7=r_E$(-T"JK0daC2c?b.l/th/GH3)ta(ZK>@d_K4aHBKfi]=VdOE"G-\;<TZr$ArPg1iS>K[%-1%[m+1*nGT&-GhLTR(!B(&]/D$HIp''J&!`=8.a2N+N*+5tXn'"Oa4EA34g)9.kKML\/!]Uh'.%5d/BJPqinnVXWr3R1:"fu?i'!!mVhIFD=,HX?f!c]p`f!;6=ZC8/b.NZ'GAjb6Q6h4!*M\@(Z`C3Vb.-8RUnO,!rSG8G^:tqaPIb?]a*uJ^e_2MK;30eAmb7l'^UfJpMu/d9q[rIUF^%?G*.>h))g<aN?CH:[J6t1I1:oorX4Qe5enl7B,8]BjgYuAX2o*t2dbQKdX&Vf-^3j3M$g:(I+R4;pot)3XX=Y7uBYg:T3q>pLO[Y)[%sAG<#QFfimC[c~>endstream
1926endobj1926endobj
1927% 'R142': class PDFStream 1927% 'R142': class PDFStream
1928142 0 obj1928142 0 obj
1929% page stream1929% page stream
1930<< /Filter [ /ASCII85Decode1930<< /Filter [ /ASCII85Decode
1931 /FlateDecode ]1931 /FlateDecode ]
1932 /Length 1850 >>1932 /Length 1892 >>
1933stream1933stream
1934Gb!#\muQ0l&H.(+r=>Yo<OqDS?t6uO9r0,K-s+f\-:k+8qI.2JhI+p[H@8'XqS'61F\rW.(S]\*-SW0=]5QQM]NLTdpiVMpUD_J&5!=8[P3Ytp9WmjZeF1g[s750ujb:;bgCC1L\kYEP"IO7UnO(XDEFNOs=rI$e&XO=,@]5]"?GPKF?DBs'mf_.4@?!/K]L9Q-]2\)d.\jP3@i@rXM)^eE%@8nEN2/!rnZ>e9!W+]3@O<ffP5:(4+0#8Re`K>s1_qRd*-uPp<+/n!bf)9Ua=KsS3$]_cDD_=`Y=#L&Gpgj[aMuM?BU6Z\P)\NRPOTYe#ecWZ.)oRA)/lE7S,'O'T!b@jN`7Fs?<GX4NKg#2T#ksnj(t0F3*$G'.ErMao>M`q^c&G$0p4Al8S@%E)UgI`.2$h;le>kKD[E:4l6MuigCk:mi!m,Q<=JS9P54&$RREYl>85XEfXH?Yl/#I=j`li/Dk5InD;P"=i?slM'%T;?TE\B9f8RWgG4bm>2hS0'pM["t3NWX9lSu#MdS4F+Fi\A#;Xb*9%EM8?J[8iG(:94TZJQKhhQ"XFfeP2(c2('fZFPe7e*T@fZg@lC8!UX"L:#mb#8Ps+p&9qMPK4e5f5!Er"a&RNo>C+Gb\0R2MNa"(.fpRj`Z4$\n=puVD'THN'A4)k0M*/)e7X&$Tb2??E7l4n`A-]jh:`UCZ[8Ca'3;8mQgE_YfoL\gIltW/E_\L32hQ:M%/UJOc\L8)#"7kCd`AIkA/Y@E10GS^c4:ub8N1l*\XS;?V9$14Hr!P#KSRYN"Lf!60J*9^i@I[$)P!,ti(L1EoX6Lh&J5%@5uX>)`$M+>Oi%;*L,6B+b]Zb/=dnR6D&M)\X8UOb2B$5L.i`=NE=Ystm8ThF"&`N'du;EtT1Nl'_ap2,mL?>mDkl`mS8Gl=p4M;4)NP+(XRk/+pM^V]?`^-1Lq5PD5J$J[n(l6lO8tIbd/h[(SQT\`k"M^MM$0!D>X0;\&?Em%+<E$=]1c@L=OnJol<o0=F"S:$KYNrpAYj[('VXnHFX8r>OYMe/;_T&fH#4?I%%l0oRW"'jNKqt8&IDR>-j.\3PQKugH70I(Lu6[>O5oKk,Fkc5_\:MPG:TJoK.tN60(cuB:t."+QIA4K#V%*ej5fG(<)/ErKq*2gJ=<%L;taEDb6Am!._>T.pir>C<lhR'gs3i+mQ\D:Y0\K,_8BP6`.m8_d27UQU+A]7WZ]<?KLR)1?'pD/bL8:&[M7Q2g[;E*iA,Esed%_7WOK63U<BH^%+]Q,2)N0$mg8KC*S>g<1rPVFSH+#B$JN2G9?+q^gMIbD4e@RC7O&=0GmGik9_'&YKr+QVJ[4r#])[UMaAR_XXm8*CWR>4pD0@Ho0=B#]g9r"W'7.2q^F3]0<c%4-+uP6k<&F6P'SW+s/',1*Ko%m-/'OQoYL7Ztk:UT8+49)GEXd5qXbn:G539rRPco,?[l]bV,rPl$J7*&TUYsl)7F,b@UZ4PPk]so>4VU'*CRq0_W=Z[<G.C4W1U6.9rVUN,j[!!RpNn<=DPofWpau'K)cZ%jc@A]kIDYh^k4c?1*<1cg3<2=N_Sm3er2B^1SE"AKq"3Nk'tU"nn=Y6QetM0@HbN?7qi;g5.];)`eWn%1o)@7fa#l_k'iS)B4C)5"F'lnQ#$dqU6[5gdYF(r&^GX-<,RX"c[C2`b8C;q?\O8Sa?+#*W*Yk%A%A6g.rd3t3s.)<^4_f1A=pc4P]osuY\me2`HFNNAN`#9<8FDr'RI/U3Vq#Ihmb9FLNE?T0oW;doEu$Gs^7.GTh6j'%j]<=F7SSuiCDZ,6cXM3MDa?%lK!"$-W*$(?-/.t*3&t8Nr!.:B[5.~>endstream1934Gb!#]D/\/e&H3^ns5?d^W&&OqojV.^ecP6iU)CTrCCPC'Z4F<2=_o?UQ)N@'YMXDchbl:SinA1sUp)HAN]]N"giKhqD>\JBs5T(%q2cZ4FNO2h(m>mu!=];+@X*4iiUk&oN9u>KlZAY?fFK_"o]3WB;T=!M$"ILf+\Ha#d^DNdals*?\gnjt8AbiG3Y\muOP^SI7JM^M9N@3)F4mR()F#Ec/QDRA74)0M:8F=(k47lZ1E+!*iV.LuIt"u7DSPL^pKa3EV'&kmY'4r,_aIK]<G>&M8Rmm[18<0dZFlE$jTV4o2&<DlE@EZ"Z&-uR-+9\I-n*+#.u2uM\kj60k#4!,0sXFB3fU)&VCjb)o<1NrV".]TlQIc?MkN$qA.k:R8CoO=oP2+5'PjC)?;GcGo?Up<2+O%S.[#$.%-cOm8l)CgA6c%bS)u<BMM">io7YYAHNJ!s9+YT)QS%Gq*)\N9o9p;3/`GU>!PB\F-E6T_P,rk8kM\8M0"dENCRIsOcZ$O2Q*6serHL]]$'#,#5P,S7Lr;/OoaZJTG2fXQF2C*0ep"]tKq$L[lA3i@8E"(rCP^c2/90;k%Ml:2`pgNY*-nNXU3qs1W%ODI`RrZaD0EC:'7kXdFCsmsRa&&(QHa=%l0]-h2e;'^HT#rPU`QFZ`Ncb+MubZrGWpF,a(Cm!!hY>7$M,rCPuO`Dne"<eQtjL#9p&SK_[b))=b+)pO\.`EEAZpMO#V0g`h:fLg`KsK3h6-[hs#E51$nprGi%6L4WnMN7jGdEU8mF\kP8pajF%",-g?Ap7de5hA-EfoanPE089gBF!-"-PLM;L9Pg%!tWkl>!&AH#[>d#Z1c%lK7'm-9nJ@GV:(cf`9@$o'DA@+-]=%0:Zb9j\OcZVS*m2pm\37f),mY#=:fF+^g8:esMk,=7)9PPe3N)U\7hW<GAAH6EL8)'o+m6M$U4hLl>roZR[nUfXt>tLN,YD0e&ki[j_0:kK19K".$+9sQ&@4F`?UelgLW)h3:%;*[\YTI8nqSCA`Q5kWZLO_:MiSB`V"[1d6do%&d4odl^ZaTn(eP%OZe-[D$7tWip.BWY^E:hQ^j;?aYQ_JAndj(=hn7Ltd"!"_!!F9M<EU.Pe?qHU;I'HocGO.^o->"a.Zc6W-ou*_3eF6BHIC6.1$`cMFV^p5P5`&0.&H8qCRR;<R=QrGDXM%$.UQM&pXdRn9l(f.D966*MK`lbtPTK88_nZZJ?UbQnLI&PeQUj/V*r>hFF=ip/<nQ1Z'Rn^6(+@;nG)iDo^JOLsSc'hkT`a?t96GYsHp%0&+?i,>g3`JF4)3Jp-73d1m_*!=iJ(fbCO6SH=6p]E)QAQK:lg<^MC^&EQ0>&%%g?,Q7;g3blLa(`nG"p^)5.kc4Qbpe\OghtI*12OefLbe.E_IGc=(8h[\#E6?U.X8p1+l+%_J$alf.c0^ig^^<6Qj2@j&os6qL_I+&NNY0!-*M4aYYl3:os(o"""qV`A$3*E??;;Xnb0AS(2QH:TCTI-KP>i?]u)QPkWH&K9DnLf=^3"ChVkR@q4_eUS7n[C@Y=g"-lR[e)q>=t5ltY-h+U']k*RQ()@:NqYG%npSYq+E%es9i/utfj=;5htsEBcZAim))uT0HL557p+!p/PaO2G%"`.8oon"<QFk#nL>fU<!8X5rKE?AuIWmm4[o!+[@#nW:#J\$Ve+?`&c]/!MHSg_Tpd5;%h4o0V+FWm!f@K8:AK6B3F1CBgG2V:1?NldgftRFY_'c^/^O>U;h`YdXmWm=J0:E2,BYBO5:'Y5rcS!N-NJp^ToiQ+#hO#=j?)R"4\i4Jjej_,Y%N8==Rl-Q0&RRhtr+oQbNI/.&RSh,s*Ns,#/Nuhlm1"hW#_u^"M6PToXU?ap?LZ(^l1F%$b^\TP~>endstream
1935endobj1935endobj
1936% 'R143': class PDFStream 1936% 'R143': class PDFStream
1937143 0 obj1937143 0 obj
1938% page stream1938% page stream
1939<< /Filter [ /ASCII85Decode1939<< /Filter [ /ASCII85Decode
1940 /FlateDecode ]1940 /FlateDecode ]
1941 /Length 1284 >>1941 /Length 1362 >>
1942stream1942stream
1943Gb!#]hf"uT&:V+Ls'bbCW`)@9r.^F3O@30XC3n#[Y57.E2%4(9f]AF<Nr.FP(Lnu@orp`lMIT.7YWK2Kc@"LXQnVNiB)Os:!Np))p:Ud0"g\>*a)GF0$\-F@UOU</ZanWt^is'o)MEY[1EQL7-SXL'-W4E$7g']jVY-cp3?G.+c+OQ2J6B#`\.Im""9&*4-8uek9DD]MfAaLe&cR%VZgTSp;]G`!5IR,^@<Jtp#(,D0U%.r3EJSm>jiA^0PVX_aTPQX'BQq@7%;.@#5eUW#?nFo(T9P]hQU"T)B&@8Qe)pN4Uru`_094t#:(=D-A%"<Q5$mFk_8%478!\BOO?Blpi;$EW#RLt/QOnQ,.g37ta[)d0$m-c0aq^SN5-RDpfQf?BV6kn5(CqfC2@sk/<k3ej8="hBS5?)4PrdQAP9bb@po8aJY!6=8D'?U=q"drl*NONp%A.m:jUWD72k7jbU0u^2WUKjaW(M`C!4(F1TF!;)!?&),.BH?:)Nh+X'MK-u,[FieWBG^6LX[rcHL-APpN/C;<&@Y17cgLUX.2</,('&CB6]B.gq`>!`krISlNQ+^q0*C[le:.sr!`AQiSYXS$*flf,q?bF7mO;KQ_<p;1d$E55Kb)2O??;%]EEA$r,=n6hVh?J)3t*cq5-=tNoK$jW'ns^LYJRPm7&G#_.!):9$[KmeY<=3_B#7?,^B4Om@]6_.FKmPh<=cGrH0-YhHH+7,V)m0D'0U)c!W`/"r]`QUniYc-oe"3^$j.[74%V?I)Ms]:;AnZVFR_5Q,Si`Dbl9U"5kY-j]DgD'h[]aduYtE"[H"87YIn.7@B%E7aQqcik)cC?>iWQDTBieTtX#A<F`=oe70)*]00\Kp^"9u*[:JCeDI]\aR0r80mi-QYprtS%uM%kfF#jjS(!\D)1B:PJR!e%au,H`8u+!_MbI[rcZ?s4[;eu_=%DmWF2]c;pF#Vt+.g,Er2f.nI9iF/?qJm3pFNdD@m#-T=n[r*Ck&^sX<%i<);pklhpCYN9*Ik4`Surhl>54;0Z-2G>*Vnlb#!5gHTsbAR/0)89Y2tW3SN$4PJm*"7!iZ0k@dXklW)hO]h0Q-'Ci;66p#.P6aic9n[R0!iJE(YHV!2dJ-:"-l?h]0_7ET"on*?N@8fBMY]c':Ss]4'nAD,=<$"`I@)7Q0,n%5oqZpO_6%LRJi.`VSSZ-=J[d+sZ+mM(P$l_W)jJJkJ.'&'Ud"c6b_m\]sZ6BP*Z45!\Ve_<(E.;7lf-$Z_DZS?6`C/T)<!)o4jY.bS"<?N83W~>endstream1943Gb!#]hf#8Z&:V+Ls'bb#`MlbXo%TH+OIUX.e)dV%imYU%AIX88JV>^L*;?Z*/B2Ce2T?ke8q+k_G%]rI^7"eIJP"b#q&AGr(CU$"4Tf<4+pR0H%P06kpVh7Ff6"m`C]+6\a"sf)*mgA?jMrd-E?TD+'Ll//o'+)//sWL%KJqVf@fad_%i.0nn0--o![H%rB'3!U4@BLbFeq@n405)-[g.JB#bhANEM=S=Hqai(.S7SdIYLh<W[<or+]bMF\:qmt0]TCs,qMoq&Hrll>7=MClqZkcrqoP[2D^l;&Xf<jfC?Asj*@!]We.DhIP%aG%);5>bril_JEG/P$SZL2U*.7g3_,mR8dbZbP(_H3l$bQbAd"kp!;%"7$u<u.RotGJHj9M?VqJO9;G$c]"/`+eh43oR`s[:4m-C&+NK'"^>Q'c",=Sd1$83[q]++t6?r2Tj`ja:54T`U)$;_%\^]t#h\H8aD%d_PfjNMG&U_Ts=Guqh&"(<@Q3nG),=U#L[SdPGRQE]a'Z/dqEYWjbp*\lcbOBuS=qG:;I]ROCM:HZsF7Sg+0Knp4,_%#Q*9Af%`e.q9&c+!EhdMPBG!(Bbg'"CH2dZA*YVI1BBBhn+OgGBtdf1R$KpNu6grTV[3WR?T?>H0Su[EA<_-&UUZ-j4]..+b$a:ZLsQPj>jXe+n>)E7[#F-hn;C@IE>BrY&bO-rrkB:Nh7rRW"nC4+Va30)pMbd"=H@ce_!4GME3DD'pr9RAK224l>Jt6RNr#J4]A=GZY'&dXK0r0K@^8WH<MIm.l/L[%helk+O@"7rN_V3ZSqE(22t+5Og[R*<#)mbX5CZr3g<=Q%5?,C7q7H<Pg9])eB%A>M^IB^h'Y?C4*h$-7<2lOMIS*l_;ZKM!<C;iQhK`cY+<!+A*q;qL8ZP(a9"-Nh7I2pLI,IZC)<sTrhpZPO5?5r>7Ns\o25YC.u((g6JA?4eV0`+[`@4:%ipUJ(ksiG/qYDRLeVs>uNZ/#NYtK[bP9;"-Zf3S>CG>/Ke]!8\%Sr6:AsO^<DC17@nQ4d>`Li?(KC3g+.?7rHM5tkN=5=W'9P<]K\$h*c\"@cTTGi+H2AC>AQtR41n_%q#E]B4rc*j?dS)'.fptV(X^9nP\gX<hPd07#dm>0P,`s&UNnK6"Z4NkpVf:M>WnT&b^L5rPZc%gV^/sE8$(mY6?s[plqPRKH.*OWml5Pskj@jn5_>jhp@Ml@5ajVA2DDI_j'_922`rhU>N!i^$mp&%03Auf?1K;3?[[S\(o'J25,7&"eW.`[cZ["bHcTe0l?5XbEO@7]$EADD\D=h@Ze1^b2+S4[AK-rmCtB`Oi;/j-.j0INo/NU%V4YV%s*kV@9IKi?M[Fas~>endstream
1944endobj1944endobj
1945% 'R144': class PDFStream 1945% 'R144': class PDFStream
1946144 0 obj1946144 0 obj
1947% page stream1947% page stream
1948<< /Filter [ /ASCII85Decode1948<< /Filter [ /ASCII85Decode
1949 /FlateDecode ]1949 /FlateDecode ]
1950 /Length 1582 >>1950 /Length 1552 >>
1951stream1951stream
1952Gb!#]?#S^l'Rc%\J%..s8;g_hr'dH1aK@GTW7anV6&I-8<J,]/;s^c54:\("^3@SaL27VZ"c5X(8FYE<3To2.K+38*[a"7h"*d%^?a"=N*>g)1]9Wi">PL2C>^YjBfW/Y;&-C1aqVa-(24]YtmNj3jba;9Fh_WA8(ObnRS9?O+@'ab/K,)6O,7ag.g-M\;^4l!b.rpI;W6.pbVKa_d<0E1(q!o%eJ&CJ_'>kpLL#M_WVem:LFVN\E'L6"[-ErT5(jAVHP9,'[4FQ:qRaj&U+eR'0q!to]@6'q@Sj@Mc^?$H=3Zh7#QLHtFE?hV4bA_e;r1RbWD4TG?Z"r9QG'fnM6qAl^i_HR/!YH)A4a?D2Z3PlEO72qWnDX7nHe9A]+22BsL[!+<n<fs.C=uQ6A'_V4hL3KLm]=UID\(J6eA\]I6hg5QiqJ(Hcs1MQ*)Ucm<Op6('X'oPS`U;<8[7&W#qlS<"8Bji''7f"$NpY_0,<OS,Y]8o6qfgfJD4T)SKj$Z>%gHEUV']kBbs)u2eW`W'-Lg>3'Y[\m-kuOfBWrBTXe!#%g@m\.T%Vg_hoCfkFf5#0K=X72YD<uc/G5tnV63LYHI2_i(.&f.9GDN+)'&N>\A9kLK^%!P2klps)-,7iU@h_G7YfLQgJJ3=!F*pZ>%QFaq,OHODX7+&t.1-H'7@^N6+)!!G[?c`6%^4]E9Lb]ird3@PVm5(qiZE#NpU\X;+kZHgK5,@b:q0@)jpT1H](1g;+4S#X<!BV8g-\$I0er-:A:jYadZ<n2Nc9.&+?ej;_YR"u"Ru="%^,Q,\?Ep`cD:E#$V?jq8o(/j\SAn6(`).oN*D'7#ol+>IA2:d(dn:_.Ck(KF@2_'.2T"*pX$ECoWGl$1@.?R1*$\;hc"^t$U)g8lJ_\R^kelR\*BZJ;[`<ak3rB']iKS&Q$d,kLBi=NS#R-IEgfaYO+#T=_8Xl'(uoCU.[`E`jLQeLW?mq\F#*[?KK%mDC(04>)kg'3lrF1g'40%lo2CW#^M_I7PApI1u;V%ZN;Vl7PG[J[IL7L-pWZBGHob"D4=)2tBF(+gJ*Wf]Y>pW<JJBO61asbS8M_.4@gkcF!h^H:39?O44QE)e*+K@L*uu;gcHh8*kJ$4gHl_03'p("9.D:-/,mR7>_Z7cb.\i&X69m&CVIJP&*`uS'_En.3V:pO:`dtkm]G%8&_:P]I-n]K/+NUDMJ(>MGU(jcWo8jjdK7*P4iF4H8[lkb]mV;#ZWo'U!'rS8)%_<BnE4_$@8B]LpbarKFNE*X/ETrR)Cr$\Oe]STj!cs+U,hU#H!/i&s=W.<nIM,GI+P8T[KcnnS<!^gJJ"/Yb/o)7mXbAAM_Tr/\arIJ*smR2M5i([hSu`JDE.Un@hNX2$pW&&G!%8Uf%+S\?O\J-/ibpE)A:K9&H:8.RiH#YP5?hRAZgHD;r<Pc,U@tYl!Qm#cIJ0i^H1b"$q"jVPLe1OW'1iAJ;Sb^O`SU:eMMM`gtA4eSa9Qr.4$Lg5s<DasNEl1s;U;6ran8K(E'Q5GE>9\gGY:Es@pD(iubXV=:_Jcj@gfDsh:tX*\+Ya+'@7F>!OrN8Ur$~>endstream1952Gb!#]D/\/e&H3`ds5C[#E&L(iAA*7R5GU`##"tGe0b=aI0[S7ijs!YP7E+eGrJm-(`GK,(Y(\l%![ecP*Zgr#mZ+_a8DglO*G#4h-h-Gu%CQA&"Dl\1@<)hG-bZi>]eb$6C_/qkH.FYhLU<q&p=$.^,aTBI$KG>;=mp0?*gQ?R)&]e?5-,;B)*.1/eFl9.pGMSo^1'd//5iXJr=[Ri^`F@hms1uM"#-oC+J1=:o_c1>R/@DWT+.eb^&d@+/SAEu,Cb=sfL@ddM]C_=W\P9G.@pnqQ/lC<4l6^dnLXFunQAIbHlJZ*U14]cs8S.?5PD2JB[M*lZEf/@&W8/Z.9VD;A)N.9rm\?nUW:1EpEs]+6Xn0'2e(#DLmWE,^s`9a"8Jq0Iktp$L[Wpne$]@-N;WWgg):nO'+1mC9lr/aFH,;)Vd*VF>TA*?_KHKW@F0SjriiDIA*4O_f*d0TC2U.'<uILfKnqD2I*#tLQ7\6gSc+EBZF3/H2WFji6-;h(GlgQi".4o/VZsXMP8bK=Cc=[JEZ=,Z3gj.h1)fOUg^Y01LSq&\hJdQDRd5]:#F[_EF]YdQ0+s!0F^/p=d4&b2l]"!Qg*RkZ[5iVG5[=$tjOJCm*ON1DB_bpP;bj!b*KA)[kj/frk>?K>Ut.hRJck/@QK!98U.$](dbGH>msot*7qJ"-PV11d4FbG>HiPca/J*e!fo<m4?ik[T$$r/0N19u>Y7Bc(+#&B8Pq;Y3p7X&TcM2o-m.eD9_?6[<QJ=0Hn=:=r._I?139858;SrelkIY`D?_@B5;-jQLN\Mga0/p!`P`*1H@mEfb,,&7^'eLQj&gN[E5ij-X8PLlh;G+1uH(QH,0k4Hb4K3'l%;euqWhcG@6__$ujGDUNP2;o#Gg;1R,^u`&7Zg@%C@-FZ<fs"Z1<IX\QH)*jD:qm((`LtW4ed5N32-l(4Sq<Cnu[F61i5="-D:4GbBf`Igt0.bX2Z9KFaL;-H.giZ@/$XCI`(fX$p'@U-+ed;V26Pb:%Bna&e!5Fpt:G@_:BEC0BCJJVbCB-LbZ+g#Kl*=E@"cjZPm5+HMSbf'GM2'b)hUSP<-*ZQKHSI?5PK;FIEoN91.!a"g`MAKJ\b>$a^kq](4Mc3pij?M!9Gqj%0^$c5]&Kfo-jIo.<UWE^bk=&E(mIdZY9-<DcSi0j5jUSB/.3"('B0BS1ho;SngX1.-Fg9IcV-PZIgWbbsXYORH!XCK1+lMeg"2k>dJ:4dhn59qEsR]J0o7._Q^n_mj8JgM#Y^L8LsXHD-X\[FFCLS,>.?T(WW1Cj[2I<O.U=@U0U5!l[\8k/;$JP"1g=2upj?F0HQZBiN"F[<D,Ck'Q#.2u?_t^DD!,=>nX054Y2=q.GU&e/,04JpLQ.hH&l.SH;t"Lj)t=BQX:99_]-hq)Djep<\2WiA;Wg4S'XS&2]q>U$-tqWX%gXc/@UT$9hrd'hh#"="MZu]0k?D8"RJ46Q-mmRp!<TXGVl@:sGqN4a_BT,AQu=bJalPB4O#R0t7-h$?o\aFg'a#k$#g8]%&'Jr3(8R]sE1hK\sO]~>endstream
1953endobj1953endobj
1954% 'R145': class PDFStream 1954% 'R145': class PDFStream
1955145 0 obj1955145 0 obj
1956% page stream1956% page stream
1957<< /Filter [ /ASCII85Decode1957<< /Filter [ /ASCII85Decode
1958 /FlateDecode ]1958 /FlateDecode ]
1959 /Length 1651 >>1959 /Length 1696 >>
1960stream1960stream
1961Gb!kugMYb8&:HLqJ!`D6YmZ*t8Pu9%jM>gL,_2AoZ%0J(-s#D*g3C0Oln7ZR?f0N_V)gQ_<[C^1D:k/"R2qj)F63lG_N;K!s#[CaSkn=sQQ_"o9M5X]_$HnSn7$]ko^V])m&j&=8<Y;9As82A3Bm<8;Ic\J`N7&<P%f)e2"[."q=,%#>hp3W+in%pd0_=5DLp%1IfUqDI@6t8`=hM=/$KBCBYg>uHmTD(A*_-dP3t/k>T4'^OhiJ?5JZn-TB)X%j>e+_d:;bfY1$(Y9s_VJ=Ac_m<\LXP%#T'*!cLpE^u?_'J==aQ9iDMZ#+*Zm.#HQR^MV274IL#>AX!DHGL8N'$:?crTM*]6kn(2FUKBjcUnokZNL]lK;_VKr"&&uCB7S01@n#!)!OIN=U8_S0"9sS&/QT8e(=uF7&`2KeL2/WQ.^P@lC?>mXFt)Vde*%A(&rY#QNO."RLmtq/ptWQJQFgI@`fjf;]7#-V,*`86nXs&\S(Uogjo"ssEuN.K)"/H(>ThL5,BG[PKHm&kf`Al#D4s/,E"nbs]p5XecC)=VAcSG-YT1Gck5DVp+$.LhH9=iR:7+&0r=2$+/,@*r5ZC=X-nQuLKg3*d708@gK'@k"'uBr&"e7'jQRa5hY"JGkY"u2rT>DWFnlmMb6Pm*a\HJ`:e4q7r'KE"JL9ldGY8H]Yqk<GB^0.EA<\l96/69&3qgc65>gc345(<+qZ:7":_TD83':9M[ZBqS2]Z^<I%W.u;n]5sOo6g>A!-1=b9%;)4!^mq]Q7q%Z:(q?n(Ke3]]EG2be0LX(@Lnp&C_$Thc"gJ?-Wbm1&qhNj%m_9N.\Y\a,<&\gK./fEYZiBjp^lMK#hahmda$q8g@C>Y'E^t*.=4o0-0*h(U6@g6%F86XS>:ENFF'`Jj.%&]U..Y#U;kk-.`NR!Sl\J"f]aV.G=2U*krEm614=N;^#"r*!0sTeDD'2].,9I%R9FRAJtLjS0&H3:0"TZ<OO"`OQ\sa@.k6!a2/V)<W#NuEK%-llK]N\82C$Q)k&&k5dooYT)hWX/$Ji^YV[ndYo3Or/?j\+)Ole4WZ>N@jAkW1i8XlTOs887g%cc49qHDLT@+6a$<h@E5_burL\KiC]FckOHkFE"K>1_5GUs%;O4sP]i?@4!)EL,sBoK1=_J&uu+L:_8EB>dg)o4tICe<\_iZVZW0aBlcD<-Qb"$1t\30Tq.G26_/<N.EKtJU@jk!@?U>WeD<aK(4%^3S-gIa["A^bIbd?>oNIGc,m>6#B$/s]l\5TNE$_n9NpKQ583^Ac-Z#$(<FR_dFP(=TX,namK-CS4eRQ,n5s&D]3>cVnSkD'lg0BolGbBLC`g[]d?A.+*e\TlP'o<fa%r#KkTHs*'^`e![56Hf?jO5dm'1mS_T<RS4n_*JLZ<J,!Vr>rfO5E[6.oqe55/%T_/<)!a^4'=4_nC0m8^h>`p"Z1?5RNf!$6aB9-<>.,P)DF2K1<#_^uf$mU;OY%\8Uji>GATqt)+Sq<ss'peO^q,1M*o'!4>^\X-eE5s"6OUf+(S=fo'E?o'dSHk#PKV"msOGX(i6]19am(mB7E15>KW"IfS\Oi]GdRcQKhddBVgmIK(d>!We?6'V4bh(\q3?S!%*[,BS$Eq2k/\kt+Q^O#'^I.TAS53ub~>endstream1961Gb!ku;/b2I&:P.Os)<<%l3rDZag*1qkX1fHBS!80&d*Og0[S7i@O%!b8_*K_rJm-/->d6=SrEnU"#Q#i*KT*uqsHQ!LCsL[mf0WqGWCC`?i/ad0[%9C]b"f=n7m,oo]c.ln#hW`Lr7:AP%d8W*$>-,TeMh5@`Df!_%\sp)S&MkiqS<2Y4!<"0_HWW<O>.&M-V:p'"bpZ\pnX>=NLbb">7M)#_nf]29[!A65oT!bn^SZWTL/Ocs<3bVT_eCp(:oOHjupA\h7(XQ3rS("WG`91nU*?Z8"4jPeol5\^C[],J8.1]AYuhg[j(l_T2(i"EoQDa-5t9S7)mYb?bLM<n@G5ANkb[5@Z\VK3ujLmIaa`%H.Lm0A]9Of-e=MbqYZIG2ag(^#4[aS7\09S.O$oBn:B50Sa+4cjN45kRDQV.$t`S""R$TeA+MQYbGo98TaMYCMK6?J3bM\K2l24KALet?K.l;.lm^.@"r]`c(Y2T<q]?DKbcs,0\]?-'Mf3(gt[Y#QZal2GJ2d",;7c%Rroe00QTAgdXp(1:^s>?XGu4KEIG,UNH!l'HUf;4OXYX=3U-jd600qL!c[or-s82CR:=A6@U7G3';$/!eJHZ7+oJ0$]GU=81J,TIB8P"*'._a#^uonjSf%Tc.`iI&JO3E4PH@\-TU<ffasbZCe3HY-Vi#TX8dK=7ddHCHE..9sQKZJpORe,YBOc&`;Iuf.87Yi^Jgq[6cd/.kfNW9L>"WqD<YH`1cSE_qZ82H9WS(V+PA'gf_pcdIon[Z>^K4HDf&VZoW[?\"RX<@H^-pEuTcGm`ko:eJ/V"[9NWKs%ZiH4XN2;5Vh.\((q@"nO!RG&lX@YO2`?$kVdfTk$f5F*4?Yg$48.[+6p_<@?17B7L+1]+[*-BKrJ__N?:7d&"L<0p[U)+8"R69A/*g2V$8EhsV5:U*S?Wjc,kHa&\Mi*cVVh8$2,Uco:D+N1?*LE_5[YKb1?ISKM8JjO;jQ)?"!%C(3NmD>+c^`U6ech^e/Q^\"1E;Gd+EY1I\QQhr4u6Moi0c%*f5Ha($I_MaGj=`c`Viid[!dV=dD@%tc,rX\C6<%Jo'C5MVX6@F,pg/Xr7Y-62GQA_Coj7Q3_BU_,Q]Q3embfI7^m5(HN9;;DCYM+N<u(.Q@5[7FU\MLAdPke9Wf>#<.)Lc);1F;oKGM*>]A<+So5fYXI"#HBuJ9UgS'Ve"-C5rXT#]!8&7Anh'm?opAA+9)O2I(5o4^7,C<-`TNhgc,gc!$^do77f>,[(VDVU=$fkJn%k,7(<m=G.SV>B(P&o&J25T8;j6&=[>K:>0leI%SVdqG4>\R\Y`W%9eZ2L;[Fi!3RGR=U0Z=S.MW#k/$&ik;ibjulP7u-S9hp/hq%_BJuYGUXXhB@#g(@`Q,e"\;6+F4[G.0pICS/smt#3.(>SV#c2eu>4V*X'AoLW:J5LV]VNnCZdj"1CEcFqTo:aaic6ir^\K%G5<RW^#,FWk7Utp8o.uCTkFOQbsqk$G,Et3uEL'@.i6mH/4:`K;oC9#KtWim5Xs'@7a^ZIUjAoHq*/1b8>jrEo1F2lYeOrXVM-Q:V3JmM[hAEQHG`(3LjEgKhKX(H4qaa%Xm[2E9)AnGS8hlTj3P>c+VB;Tpp>PdMqa:[j-`Qq/2(i?p[%4Lg@OY]b7L9//TY>?t>m,3!gL.fKgsB^Y(Ue+8l9V:!F+~>endstream
1962endobj1962endobj
1963% 'R146': class PDFStream 1963% 'R146': class PDFStream
1964146 0 obj1964146 0 obj
1965% page stream1965% page stream
1966<< /Filter [ /ASCII85Decode1966<< /Filter [ /ASCII85Decode
1967 /FlateDecode ]1967 /FlateDecode ]
1968 /Length 2264 >>1968 /Length 2319 >>
1969stream1969stream
1970Gau`TD/\/e&H3^ns5?d^E&+5X/N^Di/d'Or70=60ep?NaoF!6J2B,4e8Lg>+lh;AJ3DnhT9:'*;l:;V7GC8iGTa'#e^OcDZ$DJ=mqW[['"u4@X)N:C&c/-mLg&BiprOkKQG;?#:nT!'NSkQD$J+&.#,;X0DiLERpKG"*.I6Z75p@f\KYgF%WBi[L80hkgMPb6j]!T?X^7`q<hWVfDSMbaRYk1QZMB88>@9X>hS$,><%@apIuLKZDPDp4Sjc1lBWC.`VH(UA/".:&*ZL93JKhi.=i)LViE5/7Al.@L0.1^<nlr;WNH4unY#O,c]/S]]LaLa0K1AU4K#l>.gtj72Wtc2fDI.EDE'>\6VHXAMPSAZ>>K,pLZH8ktS4$Y>kcKFr.$-(U12!fAmN:$)D(Dg]6\7aanl^`QQcWPnWI\(($Fn>^SBh.oE?0(X4-s-?1(LBk[k%p8)]Wc`i7lWg$qe"o/nN4A#qM0U^<gj$5k,*g0>c:j4q;AAMV@*r\,&.a+X^aFd,e,Ct,N_Y<>Y<)$nd3'@biCmg^OD_$r.`A0jU`<Cg>(rNO2j:'d(XhagThhCV8\6:]><sJL@X%;I`X-e23hE,0T4R#nY4d)`V$Ur9dY/:`1;LtGC+C/8p`08[pt7'@*A%MH(_Hrmb3PWl@MfCZ7$EiISYK`*StuF+,9k'*;92]CQ`m)-ch.X]2.*[=b%t%]RhKWMH^-3^hFAlrnZje0f]0C7<oHp=^"4KL[4!1;GjmVN=tC[sQ-,+",Qkeu.uT1I#8X&.9_g5C@@L)(A0lqbeB0GP//-\hDYC`*HQ@>_`W95Xg28bN-`r[a=o.:]2.fs65\e4E)s$4Ck]_9hEF_&b`?tdUATT5X@sE';$!ifefZLaH.k0GR>S`lH5A9V<N>"/#3gZRW+Q]ki*[7eR!]!a'k)Dkg<OU&h3YV]Tgt)[F7#&`U)='2LEp:+-"A=C%?AmT*4:9<qg,dZiX(qDu(D8IgN:?O6=H<HH?=\n4QmN3paQ;45Sfo)b(:D8?4CH<19&fV^II,3\l^CiU%en&q%E'972`\it([;>3$@"(G8l/eCKRkd$&cE#US.^j%BP1^e_>Zo8O;oDp#89-jr(`\?;@Sj1'A/UVl8h^4</<W]`Fk`qSHllX%a,`gdjM6n8LSRSMR@s*KRWco;[#Lunn',#Hflf*4iKXZ$rZQ\`CkXoo;$S[+e24J:4.4dpaT@JXmk=BW;ND_h6OS@,<;B?QK[;gRn@cbM;kWPqQ'u?laY`O32j@c!^s1NF3UE&G5F>:5&De,dDfHoZU.q(d;RCN%-f]*QZF;pjHa"O[12d0)+-+3echYrS_2m2mor%Wd8Fp-=5%la-HK#CeO#PBJf.5X21)=meotrf&>!ec?*l)p797Qjo)#,?j6tpu'cPJLom)&X9bcn'ict`8KjoJ*co.k[[(.a\WoPGGhtmEnT#?]2K3m]W>5I9VR/:;0:*pK!_Lq)_oC:f7)bAH'YaHFZ0&N[,g,=1V*&kJrA^DM]*"sq8UV#g/H_8[!Y8VhG?@X<o"JJT[!f[8/h#qW_<oA$#%DPi+cTWAtCG73`)H9QWmW]Ar#.-kXS'-Phq@]Pqm[b:5S7aK=nO#hFWgTD`:U66ZE*bf/?tOJ\O$**U"?NCYQ<+s(a?+L/,CfGRrJ`ncLX]6VLIV5?kLs`Ta>hgN[\GEsIcT)(>6B8dikF`@jAO%6EL4#X[SG[?3/Gqb4ob)(_3DaebM*6j'h:2Tnk,CYl_>9cdDq"2(sh`0^f<cF)N@[u^%A^^k]%S!\-ls7!8Yf*J\NbTQ+'?,4P^(t<^<5\DAK/g;I@Q\;">3LRtgK@"V1!'f`oS>Y<BOrr9Fg+90HMI-Rmd]A%63)fN+NZat$nb7X)b4Nd]=Jj=Kro-9GE]jPpA[<!o\QG!-`#S<@\J&$REcdJfs3'ut1uTrk@&17Fud-A=f$q@h=)c?RDopQBUVH*\k*n<`2f?^#55)a57%,VZYZS]X6_'5=R&lNl@.T/OVP-jV(WX7Hd#&!8BF:N\,h:#uPM_hWVLk#f4XCo.Dj2aLQoG/(rur;\@cW<:'DO-Cb6FQ%TB[FN.X)H!PSVH_P1#]8KC4'9MPo=)j:0q7=E)@,VL8*BMO*f&qjrl\g,IWrGuAJ3JQj<X@.-q!7&ZuL$'SB`b4l+Q^s-M"%t)llJB4lbMk\1>IA)7c,))^8t]3O8&cFRuB*18o-F=$ams0T%5a>Vh\pLQ95r$ADtTHL*jA*F(:LNMg.NSG)^V!MqFtJ,~>endstream1970Gau`T@;jm[')`jos'\a^i8fu7D:u1bp2WE%[+GH!??YYRh?!RA99d[j,./[2YOC*#)cC^N`ec@^0$Zm+9-T//2`#@n2528nNP]m?&\V>o&+<"F8nh/LBTc&&nWDZ[NfSWR4rUh=B60N4T-qPP`>irZO8a0:ARTC$]U/H%Yi>Fk(l$bpnIZ1Qo>X^$k-V(k_MmWi^mqSmd`F/j2c`$2CIufi91c?XV7`'>kqcL7/ZnM7Y=RlI16J^7G8TScBZao*%objKGcIlf;Z#O>(11bFfAQYS%sBWE-L#Sq0\gO']Y=Ka-^OucpHe!5%s[jE`6#=[I/<,B0@KH&o)3P*I%h)3->P*t++OA1k:M%%qQq3:@5@cp_"\$S>bP^-hk;d<3)A]:Il+%odIWS!+<&<p<GWlkB69njIKk"bi\2jGq=B4@<(:r3hEAA":h@H^Psn['`n[5eb#7B_%9^5>c:^g?'-'H#'ng&GhX-2Xs+e;Xk=954D'TGc;&W@Zk+`tT%734je)"sIXU,\X\UD%KVrR=='B*=%**B*+!YEH5ngC3o)03[)^V![7o$b9BCFO:<h;uL3\C.,:*^l&A#GZB'3!2>JXBuGJ`H!`'5G*'XQBP0$I3b3&;'l1pjA^sTn=]mc)WqfX_U6TY6E_T8Fp)QqZ^,@-Ll'b);lJ%GhK"0Xc16e:Hp?,CQ<!!ZT";5%?FOa1AJu@V>B.:^EOJKrA]kB&7YY=\("Q\`@MfCb6sGl^I/mjRJYNKiCEhn?<QSJP?Z*,<=dfe_CUn"XPhdq-@Esg#maXei]T66(j1;4Uf]/OuDS`[9o<=6'eOm_;nDJ.e[9@ot.[Rh;:^m9/A!R*DhcP`($5KRSK5G'@.r-%"QBT'B;J3;)h!TH#pFbtsN$GWY[G,Fi:>2dL[LUn$C5d*OJD?"k2TXRBd'&7[kKNFmO&&H(g6u2Kcg[7c#&Da5@kX1sDkodc8m1herM6OtG#$E4Qr4:I6H]%3H&/b4$eS9Y=#U01>e.E[gIMV:Gi/^@7)mD:=m'uZQ-qJ_6r.=FhM]gu4:((Bj#iaLf+$_K.Z'\g<WrFK]LN%G?rH#K>a#oiluML]Y7OH7#B$iAN0s/I9q7h]N.W'Re'LQ,huVN.Kt)p,Y,9k>9&7?MLm9krJf:bQ#(]5VqA7@q8U/7K)hFt'`uE5F3CDF/#4rZ;4)+:W[8:m=?s@McRPH6f,O`,X?hGc>0)5%I31YW3I)/IjL_TTXg4gt.k_HqI=<Q$lE#U)cp]0Ru./o)\8;!s%Du!9^Zbb*Y3#t4jp`*o@\l?CRG]>65q4#P*])DT&jEa!\d:rGO'V3O4F>$!g[0bkUe'3W2.`g*j0[A*c.^S#`-TItTo:>9cKfL+A9$D`'ZnbOU<*Te7Tsjm-DHu6-<"-TWf2T96p2YpMHtWP'9l%S!>as*BgEZk?X-M,3Jd#BT8+G0gC$=3C+hZZ7]'bjm*]YZnMa%[<E:tX^I=k#]5K8(uOa`M4H:3!a+]a`,mh'D@ROFXED)Ri@*.ORbCcn287ih61'[G)jn!c<;$]=T06?k?ehKjQ3q$,5g0Q!+VMOTZ!9@kK9L@aP(Wm#)aa_^fiHC-h7&)H1\IFXc*oE#_@&-u!b#A=gulS`Kn^O_siB_X_g^A<4Ln"HP/C/@oi]]2<%%;:a:2kHr#9.k^j\U,)gE'_0j_N,`1X(HNt2osN)_g)8^_91n++*e`a$$8bV4c]rSaA;"LBAqGiol'b[I)ppCo4ZWl9kiscM2[)!A3W,T$[3YNHuO^&n$qfj,amp73::hTe_\,hDiPJ&l_)!Z@^%*`I/2+irhRY!9&:DSpLEh"1&A!e4>plc.V]\1Kgm#G]-r(J+8S/%)Eig2omlJs\u8uei\pS-A=;n;E%`=eUGe%Y%&GUg%Oh./^eI1M[fWIgbj5u(OiILZ9E#D25IN\$*X4(F$=ea&LY,q'ilkV8PsKW3OcEr!O5qMYo!US@.2;=UD,^k?cut$Yhjop84:cBV44E/anWh,^"JKVr)E-<Ed]S75(5<LO0$j<YHQ=Z(,3\/3'G)q>>J:d$_R4\L*_G:+UV/-#PV_QoYhK<.:LCQI5;!L9DUF\1W?*isgn!_0!L_(DJqf?Z`l_0UfBfAcKX]?2eoeaO`q9@5JPuf,%k]:u:7*O'niO%/2%@=O_jPDmPRt3!L[7qWiP"??7`4`P1@<q%hW*Ns9!aG6fM4`MT\\=(s%t?3lM:V],/Zl*H/J8-fomQhi8aEChhDRu9!M'5,0Vo;AGcn4hL/$X/jG4l.lpJH8NI7Ag3Y,ol7JCKZ/?<*k<-Dq3OrblR*NJ#3?94?#?!$8JH~>endstream
1971endobj1971endobj
1972% 'R147': class PDFStream 1972% 'R147': class PDFStream
1973147 0 obj1973147 0 obj
1974% page stream1974% page stream
1975<< /Filter [ /ASCII85Decode1975<< /Filter [ /ASCII85Decode
1976 /FlateDecode ]1976 /FlateDecode ]
1977 /Length 519 >>1977 /Length 596 >>
1978stream1978stream
1979Gatn"995Pr'SZ9Pr.hVXPZ1Qt'-:b/XjjA9ZCk,GFchXcQOFnMe99Qf^TU"fMTf!DNKGc3ja5:niL2!1%j1PO"$RKFs-\Lp-u/7-74=Js<;><ghrDb`WB_BB/.e4g4hgY;f2O9V8Sb<JV3\h3N(<Q\pRL0@NsdXmU2pen`83cGhj9`/0N>k[_!H@tDr6h[<SE`/S\8&e8la7BPeAFB[kWQE\KUm@]!=>R?RXckW8I$j7KEm(8fR\`NR)%l<^emeP]EEM[VJr#6Z%5P9=K(%^O2IrN*5dNQ::@HEiW?H:oSKiO\<tX/hLRUdr/:YV_NG3P#m^?<kWA8h'nE`IsWf/,`A(8]f`I=DKQJ86ttEfr?6%O\YpE9FYk,=#KCAg!"8:(]E$o)r$UW@Lc!9bcjmlp%SGKP>iS3N'j"@uVS8k*oV=PU3(k$,Eiu*+NE348cq:nh[K^?U*b9O@2ePb]_4D`P42g*0L$:"0XL7hPAf(kfR(/sPBXGpQ,/W]lQc&Rs!I54Zg&~>endstream1979Gatn#?Z2Df'ZJslp^[%0;DNA9-=C5"?+"Bro"\EYocYsu>S7gVRI.*#\"?$NMQBMrUk48QAY8SSE-*ORp86Y%DZDt6nF8"4l9eSR%7gKP'Y\+\o>c";IW#of'SaPaPLuIHSTh'M;Q>HjK13otG9*mAWYVaI"mN>uM'6Z95m[!]5Mj+M@0H9RY_9PR^7&((p!&PiZ]W8=]Rn2(0[&/EdhoCJOM1*jI_FYG4Q6n5RBU=skSU7`Pq]/Pa<&fU!'_aFRg!h2F0-VAR&(LFXU?:KO0G;d1d2Yk]uC,T"R(h!r96R$CT6[K%L[;[i"\eh7.jYrKXt>14S2q$=^%,E,_#=lU!@qAhb6rjqIB$:>cJ<ml0pa+Y0Uo0,SW"@2e\C2Ptamj<Je\2HldpFi@Vb\8L]@mb0;)jm=2a87nAEEq/d[eB\#cUhkO/Z7"8(uD(`*s/K=&ClBU(F;eZ<_l_]hpQq9I4aG208G(m4-f!:R`9_f[2e*h76,q9Thp8*,6"-4'Q$/)S<l836>-Z.,QVHmualZp\F'jhq0M4Hfc*Glqk-cD',\c#\@G=RD%/KA7YkqM>&;QC(Po&#ddlhghpb\BE~>endstream
1980endobj1980endobj
1981% 'R148': class PDFStream 1981% 'R148': class PDFStream
1982148 0 obj1982148 0 obj
1983% page stream1983% page stream
1984<< /Filter [ /ASCII85Decode1984<< /Filter [ /ASCII85Decode
1985 /FlateDecode ]1985 /FlateDecode ]
1986 /Length 1887 >>1986 /Length 2070 >>
1987stream1987stream
1988Gb!#\D/Yn7&H6"8s'aF@'[jl5n/I4Q8pRDjl<7JrB3fYC^FZVA[(t,G,u4I<bq.d\kJ^/1<>S/kJ_caIkBV5_((X[JGih*1!D]Q^C>sg-___C4i!a#i&`-9T5PtHXRFdB<#;@3D:(SBL36+.uC#6uFcH4JNa;Of&JCi6eI%Tc<RKVOPAD&g^3<r4J;Fm@`d)j]I%Uf,JL\]1K93#EBU2Oknc'.BbkcGf$d/Gg#)Zb9N!O`Is6M4$RY9n\e>dIlQV_qbU$6$qrM*ePU:r&a&nrQKU$03;519P#q8>?@X<%m`)Mdr]-R\fj!["'o,k.C[p`)(&>?^I%`6-*XJP8k%>bHc(4QRmb]EC^J)931%+FBXu5)DRe?694Gsqc5ier;13m)d:63+pJPhiC"k';K_agUTJjq>Jo\%gVHC7qkG).0c7>$-SXbVo->n!>GVom-=`]V.bS%aAX4*QLbbhA%No<JB2Gh&.gNe-Ls>;3jEg;&BI%15Z?DrdYk:m*Tfc7DnG1n>Z$Z3/h`i*J/i`D6Yl[6:"JoZEBc]Vc71P2^&n``DV'rC'8P"NYRBFG9R1e^.b,Ugr%narj@?kH9%:"QnH))2"!>H-YT76XH$@ZQs%JI427>cq9'qYqd+'H+W+I$PiT^'?>PGtJp7?>hGe.JgdA%>_V4\2Tir(pT8p&`9O)?0"inp8E6bQX3shX*c8'B-iO_N?T5c#C:73O9nkR2m8a"L-k@m5t;W]qaFfpD\FJVjFbb%A4?Ko8j*^`'"PQ70O+IH^XdQ^78>4&#07$ol9R!fR#<n@1YDNSO2t??_(&M1[C382CrsArE3[_`tQr>[o$l$K%1[l!;(oA!U(VONdiF2-=aLTBsa`dAM3`mb#tGS:%#oi`$/JqU.Ym=kEn*lS8,51M>)_W$'C=4X&@G62WQgtDk4FKPMBO3SXc4ASt3P;ZgLhAEF\.l">D%*,C++Cl"PK)Q^ek8]uSIQRpf?;Qs$THRnRE!X#sTj.V`X:-da>7#%geD7];S>)$FdfL<p'GIbp%kYEi94<dE02)i`m<j`Rbj>)Hn22-'pXhuh+u<B8*69Z%o]@2MG@Qf^5,'S<qdoHrT).Se/$',cG.P'dF]g1CN2BING=7qn"5aE`S4In3TQ1XX@&hnUc+/hN_*`2k#8Yq-P]*j76Zc'pX4p$V8pk&5`mYd2kCnndp^4P6/b0n2uel<ZX0XZ%/Za1aM1Oh%T-d,@1YZbNtF=Z]3Y#Tq1'=/hu&Jrb_iR>&_?Z4rPC;>L_.SLo4j5e!(8Pq:o<V5kK"Br03U`!\+0a9Z/_e/aIu5:!bJ;@7]&C-_Tk0jraF3Y2W,'f**LdFCgMTl`Ek#[4DBEn_/Ta\Pi7cHl!&^SrTa\Ia'=2f7[T(WLE<`ZFNYRXA6Lh`k(YrF+S$rK;K=UnF0&$d2&j>JD981n?]o.*Aa.q3VO%,Q),n]MR86++%5Nnct4oNp_\gXA7/cbK3Ffg-DPd/.[t$YU!*'g:@*"JF;CVbPtVAc;SI^,<hl?e[$\CIiDADGk?7/4?>nlK0-pGb]P5DB=3ie,o1lu8/5J=JVe5oP/:<Yob@k>"I8*up?ae/"?[4%h),qt*lQ=WW7FUgDML+u4<JSpPGUNE:%H<!a%^>dc6Q+oO03@@h_q,Eq)`JnN?%k8Ba>:`'sa*b_0D<+25\A[RDrW?TIAI$ZUR^T4\oW$lO[[R/MQ/:EjpnP"SF&1]'bdUq9Oo,s*k`$0I5J58%W7WjslO.LkIH\N,:VK+1l`;@U<6?^VZ\"*EQ_m`eT=lW^2]slDtCA(E`/-S7$Q$#^&jcAe-Sh+-))NFW9XbY&;"R+sTPD\To!V_pHGVf@X2?mUbn^RP-npSC*/<O%(AF"hfNQ],QZ_kKj,0iMCZ;~>endstream1988GauHLCN%rc'`D@2s5C+H@Af;h;=Q/&>p)o-[TJH!SZuXS^JGP[X-H)<PiCc]mp>9ffl?@(lXm&K-'F&H5'RT0"qH*Mq;756``%+F@DH-8c@L-*/keLG]BSp"5Ft)LA`(<8#$kgOLSmKZA"%?RX-%?pN!OjDn%(l6Sd+,aK_'LF"?%N9a*cD=g.J/=AJ+\'..lF7VVeVI>BXfJge53XSM,Y1RD+9u-88<o_u+?`A=E_&$+Hig_tE]`"IN[M2E]aCAZ2;m(jq`^4A7SN8FkCH$KN19)<?q,YZce\&k&*=nN@BaaKmQ-ZWkKrUqqF%'&Z=]BuI@41tNL6<K?$1+AcWM)g_q2,KR9C0S+r;.<`U#dkhD[SqSrIG1HIRX8>9Yriho[YRKe^FS>pTp15M7DT'HbDAQn,U<u'egWgu*@t`MAdObMS!#+iF4_"IE`B6i@]fJOLE>8KDa]2u1O&;8q^lQ"VfR]PsZpDQ=Tl'QS+>BQ0K8\$_Y;%q.)-$brq)_ePMQ)F()16]o2RjQqs8L8tku(n[I%Gk$E^==fpG3Ds>fdhi\>HL\d&B_1Lb"ic(%\N"_]paQ%R8)<!?F^rk]h@iAJK4LI1q(,BaeAj_2%:<:Gqqd\KZA:5Z?)6AAo>u_b]''C%)f<OK1E]buH05:$e"E``+/Z)T\aPe1f2^o0\k!B0mh#8lj/TJNiQ`V._!"C*C>;1'@/m5hok2Zk?E5(3QpkhnFMsbMe%.C=[:%Kf<d'GA'"&1HTL!N^okH`h)eM14Q/=VCEC4(le%Pl2Jl)Cio"b9jt=*&5+$P?]-oMd46s>0QMNRRdNHqXAF]AL_jMa%.>?YL>XE6VT\e:?/q:&=QlFkYO'?]YBRhXna6(^'3%>=O_bN"*S3+7!(dP4XLA[AYl7_@>rD-lVaB2%,Qd'"lqOPK:pYD20)920_B"_PKip-DT^H@cADeqLg_V$s%Eu&pij)J!(C@4H-itr+g$JJBD#D(U4NbW)V5--S?gE^:TO9-2/33![P#r(BqW5m[PmPa0%i05Qfksg6?X>0YPW#Un='Y9BQ*i+.^!4ESV&@8b=t7l>^,8Eu[Kp]ome#o7@qS;G\OT^:iAE&>'^e:8GU*tRP]-&I'qhW*=7]e4=6RO3Z30:7B`;V^p6+d61;!Qb?1^G<PUU[u,7Bf?*;uHs\"a7EM6NYo2Y1n/JSb*<#J+T4]@2OIF&^7LW@9))-kJ<c>7*7.Ci`E-\Y%unV[8P\/26OMoX!hY`V7e/ShH?A)ACO)Q3iQ\nBP@m(<P9gU\"*Ipu:9:_)aNo_]%\8*0:ck-kTQ8*`nC1,t)2W>(0>^oPaii138u2A266L<N8;V$J2"];D/Z2,MoBs7HVrl!AVZN:m/E&CpLpU'a\GG%UYG62iot2SJ8&j7O#`ET[rTEdno3^MXQ^@E5]<Mq0k%kq7G#6S'n(t1/P#)L*Os.W*LKGl;'JX9_(ID@>pmGBg>IDSC]3%fO=kc]3!Eb18#h#XN,3\SE*9FS&S:4?Y=<CBPp#9L+(OtfmF_JgI!@No9>roc-rS%rP;n"ZJIsg<_7oW[O=>AUDE7Bk2?dF7u8=5W+`)b9ba^4)a,k'<75q!;ni`-@gVTJFOub4a@4pqW>K&qknaPS-PUXS+C^]]ZSiT1U'Pd5*TikX2=',OQ2taM-^)2n'<h;,Snp3":RecV@,1cP%_F7bi+K+4f-SE56$g_#rUgKf5LnL'OXg#><fb[5eofU-bFdc;g,?KR0293_5U76YnKW5(?1-Y@S"ol:F]"Ceib6HY!OQrSQD6Q=bs4jpo4d7PIY,dl]_ijneR_:l;d[a^hoREYiuW6kd%Qg9qN#b6)qs,=cMA`j>W&]r4HZaBn8TR"^60*:>8L3F\Rr4P=NVBB0FmW#^>>==\\C0oPGiXI-uC32=4Y7Z/C5iKH^%*sO*Om@l,[)HR(J.E!0:(7\Z%%G@^b`nW3Kdt^kKVhBsIT_i-'O;L\%R-Gda7)^&j-KTc9c=DV%)>p\L?rS(DG"YL<b&.:t1cb[TAtT@iSI+I2C>piBptGDIQF:YTq(Re@KPPFX[;7`4h1rr=,UZ[D~>endstream
1989endobj1989endobj
1990% 'R149': class PDFStream 1990% 'R149': class PDFStream
1991149 0 obj1991149 0 obj
1992% page stream1992% page stream
1993<< /Filter [ /ASCII85Decode1993<< /Filter [ /ASCII85Decode
1994 /FlateDecode ]1994 /FlateDecode ]
1995 /Length 1977 >>1995 /Length 2035 >>
1996stream1996stream
1997Gb!#\@;jmY&H*Xms5?d^YS3t(,hoUeTHBW(.uJITQ5U]sGmGgTZIML?7S7g9?b]*7G3lAoCJP,""L0LTa5aelHZsSR_67YR7leuIPeR+4-.eo+6LN2Ade#-)R\$/MFaiI2A&eV0]tj>o8Uu$1cb?rP4:s>]<Q3u;-JA3_@tr/%q&'TYhK&ei`\oC2Qt&g@Sg(B@4[VG*Mc`imRH1BB87\H\"H1ZZ.RED>2l(jfdgn:KUjaq*rkb@,VF<q4</$5j`E^NlXAVp^%s1D6Wg:W\aQTrt^!4o,5>G4tMMPKV)u5NUI!2b4XV(Bj?_Fn24#duiLGT&NOjQ?:0i'3+0q\-lqbgAt!K0Q&,@4>ccIM:@]2j.R^pSqF`5iC0e3=VAhcRjoU0&rS;K-=ZN$;<@%;`PO%(MEj&BcAVJuall#%YR]\*)#Qnl<#r5?u76!lsjPCZnlloB5K"1DZ2H,B)^\?b#PHT:E$'R.KTSQK]*>NQ5eb5D]<[4['a6rl0jlYb1Rr!T^":f?r3,gZ7pVSFd%rgZ]E1KuuM<%qkip7EV@k+:t,WHiF0jSFQ-]TcJrXYCXc#MfR.<`??X!'CR3tlkkW-Ghb#LAZ9;0D"XY*6^/bs;62_!X<0GF:]U-<cNjDo&>\9`>M=DX3(N5.GH0U6S$#m[$SY]&l1Xe87Fsd&rhEo/)h#+oLPG)cdp/*`Y:QaM.k-1J1hkGH9I4u3X/K3@;P8n;\b]WOV4U/``/k>/1c+h^Z]d\4*jJ'THZhJ?"/fX`'B+_YgUl']=,>MF#e?]_WD1-qQ^-.t8/*/VKVTF<+Wd&@ZbGM*24'gL<X@IkA[g]Cb]qe$?BhY]iJ9A#_F*f$"2@LGK8.g;XY^ZP+juBI,"8ZjCA24cK)W4\Tm3u-^WXgtjZt"Y-g5ODF>k22TZ!rl<5QH?Z[@PdTK\Q\$b'90<A2Re6b%@gBQD;q!V:sGX;'7<3E[\pMR4>@9_$'a/>J8pYhGXg:QXfg;7b&?;MIgR;XJ];SB4?]*s>@^10p[_oj`hb!i`KaHE*75rA?_WOpBI<=97YU0o^jlBZ2iR(53WamN7Y8F9WVAjLH\Sh6l5sZio3?8@VR=6NCq+&X^%)kN^an?X@>Lk:2P%VG'Ni/g2Dn70Y"`i"E*KDh//)^g8WkZor$(qa)iVF:hZS'0T9a;d)?=ZWEMaArX#?76P!cN1qA,ZY/q>EV>?eoe_*VZGO%9Z>c%H/;f+>iV;!"DR[tBPuum1MD0!Al6=[2c/'u4V[K8e4!XEY`4D:%hIC]^kN.:3#4RAlJJopX]=*`M$L1.O3:3H>m<@>1[1IHr;ZW!hnJJ8dLLlc:.@3`JC>Ydf&!^\;YNMQQ]SAR">2[@l(h_F0j,9q\;F#,!aeL[a,PZIY-JHUgK\1B*S(MD<R1Q$!K/O@D?)bNZYX>8<m?8li[2LKc-&9"M)c)JA^OcD!fA(85ZDpB;S$#G/lKcN"Mj,>*^#biL>%(>QD^)tZB<p>dJ(10(n"Rb7&>kS24Sp-(e$aQ#%knGf.#ebSUjI*lL<1Y/U#`/g'S#WTbLAg0o@t"t'u3O[s0Kd(a"PDdZU:VC(;pjW6D`5TGe;e$Qg_(02*5bn`DiI'-rY[iNr?\?j)6P=lPePMQTamedeB?"m0L9hVu<mZ1'gb\i0o&B<0ae:/UiSD0WKhaauF*"7WJAZ46?a5_ps9!4Q-t`GW_6g7ZQ)bT;o;DKDN(-_&=Q>p@[IKeGTTR)\*4!$7Af!>\f]B&ZN/DF3j\;PGf8(;&A,Q3m13pBp*CXd4Ps42u*g!(T(3XauaZ(nKmPb]#-/Rn'j[P@`lKks0]Z;67iJ%@NXi(7qe:MpAqgb3I^]\L[R;<NBJ1U)GS7oO;_EA]O`8"]QllR4@,N97!l?@cJ(^)BM\Pg^McIX)]9%N/.J:?@>P%&<Um5S@QeeMp,S,FJaJGVV<2)Rn+Yu8!n[-oF/!/V\Ud0f\=Y=@cHlIjknAe9~>endstream1997Gb!#\gMYb8&:HLqIi&;:,T@.b;E(U@*obrde4j1<BMh_tYU#PJ,Eg7:P*XY%n(AFu95Lk6q9UCCASO4eHY2E1R<?Wf?e>2tAjf]6qXL[\Y"+\CgqMUBaYgc"S=b3m5BH.u,G.GXJaN5B+7G_lrGX!,/7ccCP".H)ZL]lm/=!R51Dk5CHe:MV12JWe?eb>Jn(6'KGYFf%L%KuYZthk]^:Th?r,b5g0/U3r%fH0o%t2LlT'CsoDk.^c3\caJ=5!e^S?VtG,:WjO$;qWln3!H,4=N;\Y>oV`;P'6KE>Q<>h/=C4f81t[*ccmuC[$U\'3`:nn*(Dd>->&MhuUK.H!/6o!M-mG!\Pq[jc]3T05@/U&EU:RRpHYR/X(QOF0R!UA4ar)`m\h9']qrOKH\J%3CWVo.*5%a1Fo\#'eJE(dDn@T;5JN5K+]PWZo+&RN%9d.\E;F9*KS?^j?GeIN^b>S.[3MTJ?W*95ZT3Urk`B.8T/]K9Y?MT4W"hAMP?UC8laHX&hJcYPK1\P/N2FmP>oUK0+gZR8f]7K74(HkM#;4c9@?6+?tK,k;K&m`g>.G2>%d7."DW7&*#-_73BAmQFC[QMU0L3D$8+[[0:Qt3'Vg4D[f&,Mk''jHA:#Sf3AOg?_kbag(X9Cc;W("g7P'lOEiq;a)NY8T\36l'QEBFNrTQA'jZD&?Z20LB3Idat^:+q,GJ)f(pq]I;;uDT@0@Nmu5\)uXdr$E,_cAdHg<Be_&$&Ao?RK`^b7-HlkdSgsF-V&l(/2>]n=)j\,7m#Y*rZ\#E!K1BL>tNuHjrIJ+j3!+k)E1smRaM51),.dfJ67!M.Z0tof`UJ'I!]XX:#1mmsmY(colj7l^ploo`r0RC$W?R%_B=G:=VI9djt&aF"g_=FmEScX'bl$feD->rj5[\Rd-Kn9U!hA/?S[d.3[G;]\`qSSJ"978V&@7EqNUTV8!<eM'XHQWH[]BAg`3FmBAr#43.5KIW+!s_hm<pkM+>O5$oIBN=kaXD,QjP1Fl)"o:a7o\1DbE$\rt?*_s>18(LA.6aHjPhNZjA\7NZIOaCNF>/1a+eht:m)u&)44D6,pfh*Ii)'\GR`DU7#XlFkh:=0$95U]rVjR;Y[Z"sPPG_-F7:NsLg#tfRZLJes+50=BA%f.tAZga>^C&,V.Bu6]jJgMS=+#$J5^e-nHb"5O:<2A=mAst)2@k$5J_E.+LGCiLQMUJPi.:p$=+E\Y7cQ/RppqHd\5WhgVqSrZD"B&gKobbJdn#u!/O?AnJ`H"L.RV=%374YOWZdpr(/ud'*OMXPSM<u:<)6],Gk"6d-!O*G1?lm4Wfj4X$MNmF3jh#NYKI#Oi+qdad5Z.Y9YnI&upd-plR+*kaR(X7q7ScDgOk#*_1W;(TQHp'-*R+G&.B;&@CD:nVRiSP>LpLS:XeY+o+%qh-P(fZZ@ppcr"NP_=XjACtJ`GQ6#Qq!7b!THPp-C2nR2a-#>H'+ck?\M+_!/5Pb;lG7%=$.[5ReEgWi\U\K)SX6[[l$`rLSA3k+YHmaruoK^4pCJ@%"u1asE763qVX\I4<kKlPX@Ln)4Q\kNh*]Ch%G)0<-K/!P)&2&!JsZiST5\[$A%OfM"5nfP$JJ&;tjF7tMa_C<np!o&A'&dc6P%9/11WGT&M\NU*3UA'c/Y`\kB/PHmMuS#K(WlKcNb6jaKd0"L/@<[]HY9aI,!]8Ml.]c?]KeEhUJfY<)Ri'3e2Sd*YeGl8.,ohT7\)e%1$\6Qp^&bo1CoO*QkGfs"8W+E,UK"(llYs!IG\bc.Khf*bS1u!Ua,+bj2>T%Ih[<_T,l;Fqjf=,DhAjVmq>]S?kp5Qht'Z\PXZoK@\,CQ2/E?)g"dG<3SV/F(f)$DAkE-8m/Wlis\MkAu4N1*Da,)RJP7PVC94[<IodCmdFqVKdJO%/0@Z\/G%Fj6W3/>/=gn*-.Y+Ncf/BK#S@f!E8=3#E^jON'c4!]s*X'LGV]JK`567e65tmeX&E#%#XL7`J@)/>Z,IH[3>@%u99[`9_LHMpug_3Ad;!r<!SFIgH~>endstream
1998endobj1998endobj
1999% 'R150': class PDFStream 1999% 'R150': class PDFStream
2000150 0 obj2000150 0 obj
2001% page stream2001% page stream
2002<< /Filter [ /ASCII85Decode2002<< /Filter [ /ASCII85Decode
2003 /FlateDecode ]2003 /FlateDecode ]
2004 /Length 1724 >>2004 /Length 1704 >>
2005stream2005stream
2006Gb!#\D/\/e&H3^ns5@!dW)FtA-sJ@]4uHJ!AFk[0oe7(6:f,Tn<[3GN8]Ar'rJm-&`6%qO5f&lhJJD+r7h;5=mS40qqITA=;?35IiU&W-k.u9LCu>_04G*=f_h5.J#Agq/N$.b@a,Pfch/di1j/'\nO9O5Sdn;=hiIPd2b1Y_SD9,a4S-[+<"n3Zjqa]dp"?iEM'W7&RU;TW!@6Qi'oB(@]Wl`Xa7kjoDj#7alT20D7>fUW<UE?RfK^1l9;;Hhq@gU8IQSX:6T%Bn`/&@n3%`S%160FKVnJbnM38$k-F.Jsc1+'\45Uqr.^f#6EM%Z&==ZMrkD1rQ1I4'=a,5?U\";,E&cPKt5#hl>#-PLM9n&^1-g+.2"$Wj9B=Xr?o+VO<5f2[hR-uDCM;<!mfH\)D!TY3J^@:NYAGc\S2pRu(HC>#0f2semWcZ60&>b:oal1Zur$b;f7J*=;l-&XZ9_-@dcXtYQ0Hrsp*:?PQU9]#n);kci`6@[nsrX<.KV'40f&[&Ek/#X2#-d*%<%__Ni=Wap&_,oR&=70\7</!o`F%D*CP)H#l2M?ZhPGNfHMDj#IA!Kf5nC$d_"8hrYl2)ee$Ve^Ok7JGMKAd:ioH[I(lC>miT#FGKA-FmBgN.;D[TA9lcLDKuV]]5fYGSLmfjKs,-N8XY?a3"F@T%i41u^7N@O=e!j]$eBL86!8/=$0$[Fg;7iEnT!SnABKR'\utl]bEu;63%3A(HOXoX,AjO\/t"Y#g`l.sQJ3cRpc!Mh9:E24U$T^g]8MUSiWIVGPZA,kL(XQ(hG&9@(CN!iRB7^oaPd9*CjCA0r>(W>]q57CosZBo)tt.'655o(IiEljfb_6g5Q1e>W#8\'$?.+mW%tp7S:*RFpe-8NO/q*2_,.@i"j!(M'4]W7u=f6&48b@g,r/c_n0+i_X90eD#iE7rJ2+@A`s=OT43@3^ZUsi>N>cUdN$-_3pF#j!?<5$^j%+ebqpsBj_nEN_HSmD;C%l[EL6dVf+Q53@PbR+]G10ap!s1eY:``<)*Ee%<[se8@e(Ng0!/'_^7d/RV0/dOuJ`P#3#jKM9OC[a].?3=BGs+A3m1N<%D!dZ$&a^LuTgo-)aFt/=)V@F0+M'6C6;XLpR$I@`lG;5@Hi+QCes1hh.Jh1-Eeo6UkOs2.a,B4<n!d]g9q.a*B8scWX:%l+J!l18X/JmX#,9PKD4WZ'og^X4q*W[4'7i+)h7QKY1X+f@_dM^jgo1.)eO>f*V+u\'%P1\a=C/)T(otaAh`LSht\nbMi!E1q6gPr6!FTXC40qhQTqJs!912.]H@PZ5dQpfi3"Wn`Jms<"cOc'Lb]O,-%SfXrtH4/'@@%43Xp%f5I99*kD#h0Mm(Jn-'$=rA2IZHX0C2c_c8I*W"r_N4D8)B%4T_i550@96,+94I6Ek7@hbe&%J:HXk_2(lTYIO1IZ7MU\Jd<(d2SGN+br12+M1JC-&6AfZ7u??31-u0XV@8GS7j)H=hn+cZL?%1M2\H40[/537A&7.cX7#qkrC>;It?-EfmN^E)BFbF43O_L'=JGQ6s)-HKOm-,%L@*0'5X\6cKW'S/MV3QZ7_Aajl^I4/0R*;X`(+fN7@ph$`l\JO0maiNR;8$J2oAs1?G^b(_?;/<dJ-r5%1kDr;$+5?QfQD7g*R`t]=sdeCXRasQ]M[9*ID&Sl'(>5g11O))#5Lt[Qu%/k@8l!9aO\F2S,BK/-L(Q!3*XT~>endstream2006Gb!#\D/\/e&H3^ns5@!dW)FtAhBd*4encdmAOVo2(^_)c.-Y9CO[Oo!l=Re[7nU5UFR`"t$qYt7MFcU!8'a?2UB<FQ3p(?a!PFi9lO*q;(FD.%^?*8n&q6;i+5IqZ3W7SYL+!<Y4!)F!kP48].tK\s'iPIG.jip=O_oi1g$oY+kcA5q0ha&(&4!>KO7iGtN6Y'C-(ORiMk<aPnd-YH9[#`9$0sU;IqVq3L9VJ:JYUK*PBe;p2::Z_Q'd-^+KuG+YuZs$8/;cDWo5i68(,<A'P7EO5)#eKEJ\nX"@>t<RNi)=c]DU37i;uLdhBEn6[*f[Q8D'>/IQ\c4gDH1X:ndr?lT:IA=,_^W/<Gk@[9\X'$GZKZ@d2PZ/S,JGi9"L"3.76RR>*D[N[Vt.X2D#M5$S9:U\+Gj(L]oI7je!O,Yi6/b^-e&O_E;_+lo:Ou2%cE;JkMm37`Ul1!NH-2KSA.<"Ws!nECX9aZ;\P[RIfPt&)#MAmS=e")`InI&dX;]Ca@\3u,(7PKi5Qft#/m$T.cll@_)-X\-WT>3_6^\;ru+RktTHNr@%$/Dk"@UE!Brc><h^`G^kFm^geJ*[^1R+J9?;+k;-RoGTAWO=5f3-k>"@bD5=)F&dgmOno3r/NgY+$+H!MSn*QliF5pX(ni`s7lBd*i6"-"lE>65/Mt_gQ4*pd&uBGU/5q-5,S)X<bFgaCq+f;.f:/J[8K:ng`fu>'f3hu%^K>d5^.WIed$#7n7;i[/,+%tA:nU48k=fFY3[MB$)lK.=UI]9BMkTZRk3IBM\h(_@!<.<hUB<38;DS@&Q==Y0eB$8LcQ&!<65cR/.sJpU&bqnonD.]*E>4;9729J>7eN`<n#mbCcJ]fnG\'$[oalg0r_uS\mu,3I)^:X`i(F%"d4TgZXiS:'kgcE*WOOhdo:HDBm<gi)3'`j>.7**>KIM(/9jg`dUUPp.agrr0@/n=\H23&@P`B<B;W#`(f&3:.3K9A2"ZT7T&+(22fd`3&KJoD[Y-HHk:PoKN+JW>^;%k$=\FqG9jek`J1kYI'<JqJ@4/\TGX1M/a&FJ;FL94C4_i%Ce@bTRH!@1YpM9t\Z;c<IXms[fn-c;<6Kt7_a(="XT*AP-hRmR!(5G#M:VE;9fC]XR+HC=X*g-K[75dM%11:MfJYYZX$c/6nC6K\TR>&^_4oFLsE_HpH9D;?IMUp?V[&[VIkQO+XOHcPG8@Za&DCHAm[RQ1$>uEZ`d!M_AO3iXflY$sGCm&mr$l(9bW?n`d]*7tB'PF/]\fj'e9>3(q7`g6K'e!.bRa'Qd.3hU"Qjos!Jn39d.P.imdh^Zp=$.qSj\=%7oN,-,MZ.pQaVsMNDo6j_C,/[cX\"_AqAm[UbQKZ88]k'Z2i9OJ*PJuDF[kiKc$KJidcnlQ[[Kq;X(_lAMH>,dHX+?V/oEW2DEhuXmJ$u;TaWHc?R=c0@JC8B7u%GgiOd-(Yf31jK`6%+*?BW#LL3'qdMd:Ji!jGm^D:rb>A?o6<[+Xi\t,@+]K,cuD2Hc_&P8AT'@2E4\V0#bXsq9Sm4d?>?2luAL+9uOcqoa>/_DKL?Sf\AdsFK63Mq"eL\+qBLg5bUI<.o07dE,'Q`G=0CZQtK:,`O%Y@d[]XH17Agg"?a49aCb%1.h_YcekB]?'rEECF`ZB=X.-WW-<3+#[T=Z"&K]DU$F44M&s0S``1]BfJ<Q(BI9<&c~>endstream
2007endobj2007endobj
2008% 'R151': class PDFStream 2008% 'R151': class PDFStream
2009151 0 obj2009151 0 obj
2010% page stream2010% page stream
2011<< /Filter [ /ASCII85Decode2011<< /Filter [ /ASCII85Decode
2012 /FlateDecode ]2012 /FlateDecode ]
2013 /Length 1800 >>2013 /Length 1711 >>
2014stream2014stream
2015Gatm<hf%7-&:P.Os5E[Ug"BWLqI*UrYQ/Of@KfXPCL$5F09gRe\PT(O;K9CbIRhPHmC'H8f*N#,13n*Apt^.<ntAjo^AFD^!3[bhqp#F2JB85taGXGH%rWiI=.c\"r:Sc@%&:YSlc8%Qp0:u'r(uBHPrUW)ZNjO:l`7a(>0a=TaIqGcn7%dGjBqtm[3+/LpX"=5R+Ca=$WWXBQJAOOH?fUVIphiJoDR9"m\@K4SEesl)ul[]s3I&N<C5pO&1diJ&O;6%@#5b?#n2DOrsL)&n-An,X\91fF+MB,$jL$[0p$p717UX2ZK8Ho;9X?J1AT/doVMdD^[DV-N?]Da6>P;?$8RlI3<@&,<t_kh\XZH6NeT9IrG<CD^H-IM?25`2i:^GMbd/?LJO-cU)Gfk@6WrLhS?pso_0U)[='>4@NI2\aE9P8&;4L1B2i>o)-'ge=6E6h.+rK^`T<-8T$7_%g:TZ@)UV.Mi7q+sHS;Y<.4r=HoTC/?2=<G/+@2m67_Z_t=2&HL]^+/6g+='Qi^a(4c@=kEHN27kUBM^L`KB87SbZIWpC%H+DhqK]ZI@HnAKclc7>?H^bCrHMXbk"/oAR:pp)@POY3R5-`Jf,B'ItsgT+I.=?XF0/(!%SBc9=h$\od75\B#,Ga7[n%VhI%*)-(ch!rC>rBi,?!K>kT:2,lb7@$*f"U:*+).mQcA9M(%1t)gl]JGN'?.QD;?1COTTiWj)9F?a:McO'!c2N<+Gph"'BUdQ9q_Wtu.!-ceBS0gcNM)(ip+A@$r'm&dtK0oJpU/>43Y6<1mWYImo!N5>r0^""d%AKPZsV?BL`!@BlJkWtmo7W"SP(rVcB!(8EH,aD.UD,fpG[tlC;"`]CNpUS$"j)INH"Z>2s<Tq5cBt)GFfa:=_T.]bk6(t*Z5WHo(EjfTLrgb'jaUbj1EtLZr#msD^OhIR2gE;?mj4!gN(m<]+riHsJ?T.1<&?QOch]EAEeDH#R6PZ8%F4C+p4LYYcd;Vb2,P?$B%DRhB`%"FIb-iZs)G.,@L.d])4=Bs1!C@g#<@,VdRSCEnm3nV4l!eu!_8N/gIORggS?=aW7k6um@BIA7eEr)<N[6)gP<D2,N'\6b9.i$.e:8l_<OF7I:J[4MU_FNR:0E.4WTtL;V5?I>4YmRHo970tk)"k71c=^$j@pY7e`M*ErSYP%DjacaDZ2jM+a#(I'_Vp-'(2'S+3ITCT.?-T236q^C:IJQ:@DIq_.+-Dl:.pU<N`fMalU?c",pk2W4bsQG4_q]=C6UW.(H-\[l)BNb0X!(dEOPB:V3_C3iD$YL@*cA-TJ$r*/-]I_*DgO6R%>]9.&-@8.<NTDMej;dnYR(&7)R`3rA^2pjt(orN`6X_/TVCq]?8C7DOu^"82Xjjll?R.Vd8-*-25'oZDWcK`g[42D84<T_b`E[7KQ=[\W)p'KBf8E`Lj\@:pOHfVo1FWCkboe>9pu3Q[<1UW/%arh@D]/Pk*Fiu<R"p!hG^(GnP.<49/T>I&"PCH=j8IPdY-nWFkiFeEl[e`Z?/.!NV49B'W?4]9IdV,)8@A"3(i=gP-7Z.eH)24cFjosCM^;.F,%N=AaSk1Zb#&KEHncgI3Lf5l.[B?p[0:iEU:Q1=P^Yh?ase<BZ]ZD-s%&d"'\I'q*]@o%'`T('@=*5I=g[@5t#gV'<i_=,!;PelJcjUQj@ZQ+tV3Cb(W2K'Aie\cb/LbiKB!P)ulB6P%XhKV!smb?BpjIiQL+;W>Km2D+pB><;gdl\Cl_8ob_583Ork:<e*`.i/IFC$#)HP2'?*?))arW<S:[iP~>endstream2015Gb!#\?#SIU'R^LRs)@_:e_(q]P-#75:JK62):B[$?0oPG5Y5$8(Pu*Zb&6q=G:D4Nh(8,uWRqj9M.MkEnD&(L8/k%jCKKt%#&l_XX*6JS%a5Qi-e8E4\+"QaIeJ#8AoG]c!Vig5NIkk0F3`+G]dke!7E2^Spl6*Ur+o=A/JdM^[,?,afE3XS=[j0S#`O>MI(k<NHls]Q1+G'oRV=AX-s^esQsX+6ljoJ3?X`a&)2u\YE__<CC/DEq.,Lan.Cd.krJ`B!>Ifji\ACR@r*qeoa0d7lK!9ma\ZeSip[u%`/\,QX_=K\f+<F&hJ&fHCM/\Nd/G(M%_*G65k07ZAo^`Hn_77RJ'G\^1(5,KQZWmh[!"m3`kUZZgJCinW<#V:SaDTS.f!o>Q@5BCo3b*G1+*bd@oHu(u#&c/5ikl']=^K0LD<YA]>ei3d%p2s$lqCY7kfl6p7uRbf1-$F)9U#:k&at\Gs$O_N[b#$-2Dc+ar=<TbpR`G,rR9[/?N7jQ%2KU-m4>c]IC^8&:0B*+Zn.lK!2L=2.3X4t.)EcRP5kfI48Nb;`cajJ1c!KQ/5g:Sl2%;Np&qK++_"p"e1o4X'BaJ^IKe!KiuO*!0/bsOVJP-,\9\rfjYdm`^gPO!`_(MiTdV]#Q*IB6c=ZPgPB$EB,L91[VSOm8*`&*E)bGD=!Xg+`+d,0S&@Ab$4Y,Oa#tdh0h]0Vn9b/q"B-JKYSXH]h7+"uAc*eQ0FuV["SoW(QJX/R[.jIgN$UU9$^]Xh#AgreLeP1TgTE`RC9h8AUdqSA1N?<$Ce%DPUjXJTiRDK:V@S<""_*#n>1s2j$;diE>-GqQ>&!68peP?aB)MAfkUrjEb.8X#DYU2SO=)W\+TU3=McegoBnchh]]ASUDVZ03B(ArpL=VX(*!m*V8HpGp7Q)VAP7_OBbobp\,ZOQ\A5Lkdd5d1YIIWimf$<cMG+*sh"-bCt]_,YPAhiP8tp`S,DU@d!tP*Sb_3iOi'8GNT%acOP78?K^I@u[ogANs]KJP]!BV?Xd4ZK=@fa_9+4U,Vn+`US_PXuVUW&\r?]"%1.piTOB=)[FhU.f`.6XsqOae72A)A9]tjLBonSM:_a^Ge"i]hr.tjb#b_cXlk=A-/p=%?AIRZbG7t](a:HODI^+Un=e1^0hj^!/m8S/g;t(D7h!9Y5>'&->>tP'-2UR;6_3SXgL`+5BZ!sFI6/upj1J\J5YeGqidYFh.cC*<:9Z>CE,*(.bb<6YRkj@;Pt&pJOO1fjP$(9=b5d26TufoiRqsu)fN5dS&#/1`_Lbo*CA9fe>ZKn9-H"5e[#D98_2>PQ"/Rsm@TkEF";E@[AWF"W,*m!JW2$+jc1/e:G4A%d.3Vb)bE3ukj,mj"F=';GkO)+QlSMBu>bJ6FQN_<m86'N\&WOgo-[VW<JoQ2?.sB9P@dej_Hb\).X&rBs=JCVMH0c<Ip3q!A]m"l6*ub2WFl\Ej=nNP1E*7.TJalhC[FZRjNkXd!2@_D_;m*(N4USMg)/>EKH*2]^*upK+h503)J"^Ft.6XdiVumr/9h1VU4'^Ke"XZ\ZmV^a*!*&g)&;'2M`qTIjm8k+OA(l6O&aaD<U%\smrUZqVe3`:%]?A(CG;jK%$(Wrpe,)f,c(6m.C[/Iei>Mss##lK&/:*tR\%d`t/T5N'12n6`L46PYk#i$5%r=6,FXpd@P>GDm1J)[NraO>qIeFS"HPA7~>endstream
2016endobj2016endobj
2017% 'R152': class PDFStream 2017% 'R152': class PDFStream
2018152 0 obj2018152 0 obj
2019% page stream2019% page stream
2020<< /Filter [ /ASCII85Decode2020<< /Filter [ /ASCII85Decode
2021 /FlateDecode ]2021 /FlateDecode ]
2022 /Length 2062 >>2022 /Length 1761 >>
2023stream2023stream
2024Gb!;dIrF=9&H+gk^;K01.ceN.R%L5jOcm>O3pCt5?"d$!OK-9+lj[a6j'@Ge:Z%SJ0b=u-cpVU^.06b:oChRqRi,IEi3-qrqD#eI#gS/W\4mf7_/28N(k%."UZ8-(j!2$<g[h)ioUN)9pMeIKd8*g]T;jGS`phoDAaK2j@@(TbnIZ[EmW1O)p)LFZUQ6I@jMGt#nk]GdEDL"b"/E?E]CYW8d/;Hdpq7Qs:50t:1TjNnV]2\Fp+5)7k-&!nh3R(a(Nold,@U"V@h/8Jr.p2?>glqQl]AE2-`2n7Kabu!5OZP>mJ!0kF7HWK'qbdWNbaK'5l#\a&==%Z!GsTSKIbIlLZ,Y3k)7\$jDeA-ZBp;`heBhF%GrsM3;@bg2h;AkHtO/-#ZP[AD*oFJQmcg)YBL*7[%AH&H\j21/-Eo]30abh01i;Fo4.N/P"$$]Pc8q[i;klbcD?8>,r?'N/rb*'q&PeEKf7Z<NNLlZIN7h<WQ>!h-"#bjiS!.I9(k'kE"<;R^=.LpWc&l@#cZ0YOL,.s.hb,%0q!)%:%U7VG<B$&XOEr?;C7P$)5i_K+:LpZJ7ig$^@:r=K;L'A$nu0UgNgAjf6r@?,d+&#OPT00%[+'r$/'1a'pLH5+m'KbL)WHUR)]/OipUI7m2RAUY"'6*;;)CK)ApK2]ED_8*!d)*&nI+m"5hP=MXWUW"q6u@g6otpScM2/=_OiIYU%$URQO74o:d0%;XL$p"pDKdOhr'R%C&Op\r1]mCEARX1Z.AamW6]c@G\c3$=VE"+-iN\9UOsp`kK'"A&:DkL0hU8[sJ@Yia-eiRh'nhY["goW*(kj'Mj3L6e\(5,jf<#hFB+'9*(IN71i!^m3luA`m]*<ThRqT2A<e;Yd,G)a-(e"(@=rPl]h9U.P+GqKj2Dd8X[bPkc5>>[A\$S.(qeF1"#FECc>P$&:Gl<qOjk=nd_$o?9T`@Sc/u9m=VaSaHbL)#A6C7LGAA0"9u8mVb"F1'1[q:_^6o;lg&B>/D&H^($(NB5d1]lh-NPImF/Dr'5.?\N"u'A8!19?G,-g,(uC%4gf=n];lmDua<W]Lf8G=#d]C\[nu^J`)do`:K"Cqf19;c<QRpo4,0b76Sh]6!bW\5MSm3fq!-E[Ah)5@_E$q$+bDT`D\%kP4Ld7ti/']W)C_i$blljVuJ7A]Tl71^o?*>"jZ:4VBU:ld0^d=PblS.KL2N=]_jqI'Yb%SGV5kns?_4N34Qn:QK_B:u22i"pt&ZP#"AO0>P=1DuR#+!bYD:TQZ2<k\Ne7\N.]6jEqHjYMB3J?27TuJrj5FL?f0L*>V)m4Ur_]3#]'%[uS@\ke7iN%&t+AjQk(,Ep^5V-8[e+NL\^1]W/hZ=LRXVSTuCJVK2KUUQ3r<F5CGJ-6:G9V]qN`g\$%XGKLoXapAaRbuG@$n3d@slR<&uit^WfMm[UaYfA(1C+b"UntbO17F7JHNZR=qkR"NJ+JUpeFNb%_aFS5o&8,6-ki)0`_IN'WTA>B\HcO`X'$kL/A5ojhOd^Ti?\*__Pg#g<$A!ZAGsB)0"A)15`\EnSAB9&;YW5SJK.'^T8HWDZ0G^\`;=8:GW_ef#rMgQ+$2PT#IZ[/Jm%4NnW0Zilu*B!^nMZZmq4Z9Ut@'V0(Kg"sh6k\Yb;s$!OA:K*Ec:`ORZud'?VlU]^?]F<N05*1Mjg+U+^F;,X':pi(jkS[)%f[RX>2/Am++[r/D;6qY*/2*jDBfXduDq<QiEC*Ip6:tr?T.#ehqnhc]=PSMCb&Z<jNd1H*h1r8tNd4*WA)cAJp>q7@UCHD)kMV$^tGs`Yu8r9l?WpjIE9=l(HaQ[lR"G\N5f>:n5qeqiS.%J8WEUE>VqVtsp^(0lkW#V&&rh*D=>SHslS[QP9F]b_]4S%`A":/GVMTS<)72VG``j5Kt+"r'Kn<P>J>tWGrYQ\p^If%o*IeUL@s1KcOqW/N%Vu\le;D`i7'=bRKK\&$A)0Mb@f%5)SRr,(\m;t:(Ckrp.8.:"d$TF"iL$*J/LnW:63R+/'<'HLb^#?$V\PBVL^I,53Y0\Bd=qAmfa%-.0X_)@P~>endstream2024Gb!;dhf%LD&:T\)s']4`8B(D/%G4oSUu\\X:-+ro$WU2`Qc1$4/cJ&KlO`pEG@k\c8-0Ki4Hq7EQee(_De?_O>oUBIB:JW<"h5Vk`u>t6#KAR(HWCZshr*,Vq:Y`BR9e/3I.6u\X6U:E>'#/ddqsZB]L[b-(uC-:S=arKe06q<,Ct$5_t%6+P(Gmm/DoXRDp\KR#c6Ghmn:k+/3[@Tphq#LD"R`+>]kPCZ^bN*gHO9H@'/;?<e$I6W+25aTQ<ZC*'n=)TiV)]Q0Atj=HMmJ&;sY55[g<sSuL#hcF-D8KF1*_df6>1Ko&,(?lUE8;!>3X#r2mO1.3NEP"K4Mo,8Ja/jX1mJndf55=o"3$L)-lXWSB7;_;+k=Q";O/6B1b#kB_qZ"-GB8ec$3Q[t/oRQY&UQ.;u3WaUpt:nS1.bTWU0=RS2@27$J%WN?Y%P<j#\#6erO6c_&]6maD>\?5^b+uhbDcXmULFa88Sqgf>)@[3;6C0Wr::G/*t:Sq;553b_OF^6=#C=RVgb<B?oF2AjieMRQhh2C,t$TBj#\2h'2J&:i4<q":RPr4:U!u$HR[_cS+W?\H2K/*`\(C(T*m9,'Om;WB8,C:g*/;Gnib*5R2S="F;D*WI(%!u[`D[oEBVMbeHK.qCCT[;LKr)lQb=]lO,#ss0*PNba)O:oel8LR#lj\!]]m5:t(llJs,#D&k-X91q%\k'o\6Ql'7rpd8*)^HcjTZEH;Zg?SZ,`[Ti%GdmmU?..5+#&8!pj'cAYM1u!*ZrE-EN1e/6E)<gdJ#abN0NY!'M_#2n1%C%OHPEm:g?,m.T!M[i'AV7RV:^.83TjiWNGOV:pqg0)-$r;8]B5%\tVO-jmY?3\Y_trPSP0j2S\Y:S`@@M9JY2*;o!R3r^dgtrrCgHh038HFjG-870JlhqCJu2+R4CP,VlTPDI[%-]eW0!ha:Mrnk9E\p2DTdGAm[/4Z.bfV:)$I<GX]C_-L,QWfZJp$Da7HUYi+eoLlN6Q>2M_;T1YAKGLA/7ddFK^J[p17Ed=bCAQST#FslchLUCGf&gOUFC6R4Nk,IDjk.Vod+]@^[sJ0,*^kdfq1:Cgjl1=bbo3Rc)Z<GOiXAVU[+u"9N^X`6">\"t'h3!,W9r;WO6=2DRn-@m-[\9hF[L*RV>^d+["iAa()Y,\1dDWh^*$HOata8@^*[8IP:GZ*o9k<HlZdns3puJXU5t>$lD1HA3%(5dh``FT@=Me,rNj2LXNL6=_8dL`gLH4Y_k:;nJm_Bme4SfO&lTBndIm%LWTU_=4=h.nB#.+br9bocms!Y-m+D1OTae8n!?^ZrY2c%H7Z]juP\2J$3DO>kA6N_3]pj\Nd]E'j_&'689*5Ft2rsYsL?7](7/K?I6H'l`Hb&.hQLcS&XfF;^5g!<\D%!"f#:U:q^A89?@i4eO"3C.RK3<hhahfcd4Y-pKl.A87H6+81f@uRN9p,F<S,4.r,9f1:G$p.YPK$j@bGin<A2LhDP_%[ln5ip_.TRZJWQ@9u&&M60R+ZSL(L^7uT3S#p(`?-tm<NpJd-Xs-lHC>?&!,l=j8qfG98HF9VC$0-C!@aa0L)9<>H.dg,HN$H,]4!Q-#-j>,01S$b*%.gJORY:0U1n,0B(W0f%fDu@!Bk4T!Q/SHf@-5!H2'^KZS_n&oiMO'2uEPr<bc.L'<ds;peBApP;\$KDo7_``A6Xp^7\X7C4?dX#/F&64/.][2dL`WlGa^gX>3Y[P\nhq[B7]Q6_(:Ha[WJ5Pl8SHBCo~>endstream
2025endobj2025endobj
2026% 'R153': class PDFStream 2026% 'R153': class PDFStream
2027153 0 obj2027153 0 obj
2028% page stream2028% page stream
2029<< /Filter [ /ASCII85Decode2029<< /Filter [ /ASCII85Decode
2030 /FlateDecode ]2030 /FlateDecode ]
2031 /Length 2007 >>2031 /Length 2136 >>
2032stream2032stream
2033Gau`T?#SIU'R^LRs);>"3/+A9Z6e0+qN,=6)P@JDe6O0Y+eU.8@O%"m8B(+JrU-NCcQr4S\X89ZQ;$ijSpTnaPrra?5L9=gF+=c'G^&+tkJL[9?J"S]i%oa#*$<uY+*l,`W!?02\F!V;LNAK:I_%0-=Htm&L*tTSAB.2W41(Lt+5qh.,)4j)6&ksIkgB5i])E,?KTC[1a`XR(B4o5K@T44/D!<]u,g3ai^bV$+_r"fMadn+N\GdhN0S3l\D/JX+iT\[d0_c-12\u/V:S;pdY.lW3YID:gX^aRg&n"NIFC91VE'h'1^aQum^f6[8$nE^\BL&*BnbIaj4Xd_;;KoUZRN'+fHTQ&CdJ'1_H#5K&*)"28<04&gb.0nW6:oPFQ(/7Y\&&FJJ_N77)07BXWTgWt/6#[;<);0<p)!_O]ZecRIL4;C1h!o/Q=$HN4C_Os(#X#3fKhm_m4Zm0+HK:-^Ihkg5N%;B&nb`"/^:W,oC_D'g"#$@0CSr=bB`^ADRrag^:1jb45n#4Bh&F#k;b7Ccdfq'R7^5B`!(?>'(l/$20sL:Jg`[QXj.f`$EDs;Oko:.6@XKurW"R^d/dNqbr5PDf@iMWVfPB:r?CeVj,d?1&T=dcidmFB]EDJ`j[d["Tss(QH3ZCXF-^BRPjs5j9=o7994_dHKE,3f`1Wt=2c-13R_WsOSW[m??"1D&fQ`22H4`SmGL=<?Oi#FA6EB1$.Lh,S1GNo?l;=$c49cbnh1aaFDriIJ1;8>!.?L4;/=cUNanTU=-Hln<Q&M\9/1lS(_U]-Z$!Nf6IrdlB>ha^%aSK?nZ>TEP*=C7!O3J-ao7_E/[L0smb6RGh)5jKV*hA]T'o>MQP`&+J*0G`WQQlH?DsVKf5Noh]!50e.J_raCoR^==Guj-/H9pV._WS9],1`;0V#T"@0+Ek/W=;BbP@6AVX^EqbW*R[@@T.IF>7b9u.BSJS#E3Sn!^ISJ:no7MBR&3tQ3`,bVj2&oSuu8#\/7JH90U1>4>c@Oh^a\Wr$.2h=o%.F%KdoF]\3#]J$QmtnYTQL2JfYWWSI]DfQ:eKDW1lhUCMt<$&iK#R;SCh]]=1(JC3HR#HJhM0B6OEYpq%QEUd`miY6")_HlDJ:%gEO:5k8Em:$1PW52MqZ/m]Vc*[aKYrt$)DW[P?R`1pdRM3mR4Y+p(:j)J@Po!t0Da?G<iQfrh,\eUC`/B$U_6M6eN9=HfSL;o*d[s97Pu/isWiUERPb;`H=P6J5HGgsUfi1"J)aKolSn0ccNR#XSb[Q21KM4dm;SYt#;d>W;Ul,qBVQ;1*B'i`<f<FOn'j,'.2n[WLXQ^]tV(q5%,f6nk]7u<F86)TT3GXjMVuO%`('Eegii2V;1hq4!rB(s7,@bl99Kk/t&qEVJ'X;S[,]8iRY2X``?2Tsh"97W0LfM=PPa,?cY<+VS?>&NI>>>VlErBX!m08Ee:"RES8[9X9R(isX!b"Gr@*RZZ)[`0=67ljecr6nse5/_&1L(bF9!>D%Ei7*.,2'ck\12K;2FEI+YGX)GV)@AqJX&Q%RTr0*'Yu,-X>'%/?&n?+\^N$8/mPOZ:P:>U2PW/1-)IiUQE)77'I*ZH>]\47HP+^*![?UIg5K2d/^ULI,[lXT6iD[JpMDu"68^2pJXQdjNl=qu[W""1k3'<M)pPT1ZhW@I3=PciIaaO1:lb_XBSNWo:RjoD%[IH0XUqE]/C%O6W9:piL#+/a:O$P24_rlkf;B1;#Y@Dl44=8MZHh-tG]3@FBWDme5\Cp*!hBTFMpc49[[qg4%C_NmI41j!<.u-5`aSn+`taK5<;F[)C]96UIQKpR/)'p'M'FX-X^.@ZgFbYss6!Gs4kn6M$"M$)`!8"'cI#D4aV:@U_7mSLJCh4_DuKL4gQ_c$%oL)K.i76QDQMfGAg9:I^-iiuZ1_bAAumMh]7/B!LI&Ga`gUV:`Jk3?heekrZB!_Q)p'8m40B[YQ(!%;Hs)BhpH1ACmDGr`E_W.[#rX[Na%-.0[!4*#~>endstream2033Gb!#\D,91O&H7^.Ii,;0U9$[qqVIM4^qOcC["gX)hL;u+OH[26_6L>Oe!Kt)2rc/8V,4UI?0R6"RWL[`bVLpGfS9\1q<ia"!5'Djl%KXs'8C#dg\!H55JsDXiPE"@"2C)foqC"%e/S?P+4hJRr,S@uZ-Eto/W[&;`XWLt:,JF[*hYiLBqsO?@=e\EcmSd?HN"=1^e_nh&5')"W+NOZHZ.f9\nlKdmML]Q0RW1Or3:gJh5E8V`R3s'Jb7NEN+tsPUr,=RatbKS!b4$[-DTVg0RS?Rj4b6F>@bnFOb(u>5*AMR.pu2sGcEPM=\tG/W0>[:9>R#X]kE_k[7!NqjA/$Wi93)qp%BUMcarT>U#1?NJ;]@4I&=4T5U&K!pH5eeB!F66Qn`'EL`$:Git03mI,IjB^).nWY^f<bdTD1"%UV69F3:=SGuS3Y3I4j86CJ3;@l7LEClDm`JZ/nfDHSC8*(O!F,S9RDEXub%AkZWhBjn7,UrEJXkuGZA1#es.7&L<2b73Yi0Q:d?!]gW5J6#a3H-Ul;eWa\^`gKSfg5A'Ya!WK"&D<sA92\o-0#DcE0]Jhd/S#1h,*b0''l"*iV^?")\U/$VEa5%PWX,:p)d:NSRqHD+MMK&%X:s)7oaL*#oe?V\"dO-4M+.h+CNu^)Q3l9#O7u=B[!O<_F&f!@$lpppmQu+C,mHgDaQEU9Wat'\[uH)]eg%U'UUBY8`[HmhM8D&WA&&Ea8]j@me:pjD=ib9plNR*'K@Gip[p"[QQCND'ijC^`hU'T);K<:GNI_Bc]c")r.6<mVRAlr4g_'"iA%A,GH1>`NH[gMAl"m3QK/oGR%?sb?17;XI&`tQ=!fgR+K>gI'1V_4'KFkR_/1neF9ObV6=Z51:oA[@^DmZ="DU99.lJ9-2Bkl!GMQS`u?^t2/L!;Xd4b`.\9c6jS/3gb`o^F&B_W%%]_?qX5f>bBTYP%Q`&'aML*?3`@D='HCYkV.K^1msn7(A;VAY9]*P$+l).R1k^*FH:ha8M'tNO=5F]//+9&Du="W.n%-<L2?kh06W#=o-P%YL@6iG+H=.;<?5C6&-[pR:Z3[g#ETd:]-Q)WR-0@$-m]NNV;eNr$"9G>SA^D_KHjOK?!=N])VD9pH#p!ktYm103;N,YD/Z5T)J=@Sf8b`YN89dgXnYtpO?po[l\s'cP8/P:\;#'-<J/`kuC2VNSS[J-SXP(J&5<MVc:>U,N"V(%KHG^;mcDW4a,A`[c'spgIZ)Or-c$#><tbj89/F`M//QiiQ6o$Sp7tVD97$W2VW4o\pJ@m+./9L4F@YkmH-T:C,qC&&HjiP),:SD'IZaOi4+)e'#1ikoUgla5gPG7a5\835+@3(g(_1E).0J,_Cf5dX,tKBd=O0)E&C#3$B@C2*uo\#*+pEUYMi18*aV:dDsd@R_G#i>aplnmKp[p9.:V>jP^?)XZ-L"m\+&2"i"Z?F-^(\$;'`oe(U%tT6'LT;fA/=5r*K+$IYTbk<THKjASN:8Mc1Ran;:79`7?GlDA8dfMW<r'AB*VnLM.r&_mg&^1QAr'"8ci!,OlEY@lLS,o+Ti%;ZI(r6T90V"!oTrQ:8Z"n4@[ehknskj&1DL.mCdo9M>?3I;\O"5:;jfENd/!d%Hm)$brTe_nf^MV-:2`Wj0sVF+Po)F;VRm5]6(>24t0^GT(IiauRc)pmQ`\ip).rNa5HOYq7>+<*kOQ$_=%o-=0>l>$;%u.!IcC"C"]3.qDn1i0[X/)Q]+h\[>kVp8H&81b+_Q_T:**7,R6@K*4N#"$O)l'2Y:j\2X"5L^"0jiR0B'ET//Xi]`]KDhD5;F^S[L9<)NlB8(Q1'XT.uO8LH&!tJ2JB$+>!!--;oPQbBGSWgsYKbb7+'o<K#!@'I[;(_`;%l&s]/58,omFg8I?ki]8);U0PSs^5BXMU-iipMXWXh_)JUFO\PAt`CmRHQ8_hJF++%jb#6cX*$a?K'4b['P_A))='\VG7+D*DsbhHW'&U^O1uQeQptdD@?As]A%1'2nP.I8$<64_4]FgZ%^\Fh"L6*"`Sp=#rd6j8ZfieeW3b?S*g'FgZbm,=PI<#j?^r*LF;jr@G*;7-.$A7lHPpL<5+Q8]4S+sa7DmSc+qWI26kNn4E28L&,l`aVd"l~>endstream
2034endobj2034endobj
2035% 'R154': class PDFStream 2035% 'R154': class PDFStream
2036154 0 obj2036154 0 obj
2037% page stream2037% page stream
2038<< /Filter [ /ASCII85Decode2038<< /Filter [ /ASCII85Decode
2039 /FlateDecode ]2039 /FlateDecode ]
2040 /Length 1789 >>2040 /Length 1870 >>
2041stream2041stream
2042Gb!#\?#SFf'Rc%,s)>Hq.We*bgDC$XqN,7*W`ujQ[d<]6dV:H<9X-`kAmBpgqqq.l(e@1:o-(+\;#gdGSNFmTgj?1+o'm[/f-DTPkgSj85X@s>&I":5;85V&rR6tbe!"0bD6$C5YjKEs:)dtD:O^#YHmD_3N8_ZiVV(-imk.W#dh;jhXUEhs[QHt'YXaW*G)Nf\[QE!MDS7BbF#m6?IR\?GB#:M\h$(&ZHH$RmL#t`83F.Fq2.'8]1\H5@qc>$?oI!mb)Y-i9\712j$W?aq2Ft@dQ,k+T-;7hi"F8=7l4s,VT4rWA(Z(E8/0Bas]Sc'M?N0s'DgIb:#8AqkCF'Xs26M:'-R4K2bjLRt]O32Jo43aI]N#LNhOe06(Greu^A.M7_6VuV2o2h7%f(p8MTp'SR\upMQZ"AJO#nB.hfo)i]M@D4h7KZJP(k_@17jsJ-#F>m\9V5J7Q^1XUVi1u.K:NW8CRr^g'U@:mn[T3dIH47ipfU?.C`WMP'<Q=9+4noKr"t)K]r1tBZoG5c#6=B)Y2Ip%NHd,aM0eIWY:G^8*&'/b-\$=aQ1dLjFV*["ZOdf3hQlaD-L,V!?AN^#n;Qi"=9[++rV1G(T($P!\d`XiNaqdp)mS^MU[G`K8&:V"]>O0oc%?BOUAG!17dBAU`?oo]j<=3Hng_,>Z]+Vff>_\D<5KKd\Oo!TZM)GD70s')Gc:BP14LDcJc7*RFK)g[j:/Mr9B7#"3S\[A]tc`Y7tdVe.^PP"UJkqRuS4=mYWjO,sQ4`O:".f,Po;9WJiV5V5Iclb[,<CiN$c!`g*Tt@1I+ogs?>C5i0%*',iC0W'3f5J:b-AYWXo&ko*\LB0AF6oTmeJ[\=]\:hqQEVh>(;OJdY];jWe=fiCeBA]ph.j[c$tUN`V)Q<384#N()kAWR:aPndmZ1#&@Yg@>/jmJ-'+C'FM#@>F:?8IWH!/J'c!K,ika&6u"dR?F.4f+;&QDK]&dSP'[p:q%1Up-&Sf'a<P.h,[+&pP%Qd9Zu-H<$Te(*bH7`kQrf?k(ZY'BP`2f?dQ>!/4W^[1]YV(a&2r1US%?=61er$l_<,pASTFJ_WF:A/=gLdf0l1l3.T6!?pg4N5h6f7W6g','0%SqN<6l_qu4Ke)mKXP#QS66rsH5CD%n5>D[ShOQY:/@m@P;Vn)9m^(LSIMWcL4#J.;O*fVSPeSZm1NfMuc6GF<WO[T;&YWfq4@No%-,\hV#ZnZ/MSGGnMM*$)A<*D2bSlMT#k'fMN,Tm;?@I%SFGUVf"V<^FoHn@FPJ19s!E&u1oT1T:d6VMAXKnN0YjJ_Z!`]A[cr/X+'rjc@jb.[-M=goKU]D]YFpAk_1MkU3ntAT'nBR\RUf3i5l10aoWaTB:0cs0OYO<d[<C3+dtWM9eo`TCP@?H>ii^Y>2jkFW4V<3-Yq5$)73NW[Z-X=<oD)QLES4BS?7Uk@lKMCdEagEFY+`#20?8P3T&"S'@1f.:Ku_3DZsQ5p]^bm5aYT8(,sZk%5m?q`.JXAas]XgVid7aPOCc##K[Z6aRmd1O'q3_n`+P<mia$VI`i7RC_QSaBErAnPL)E]B'(Si%n._H*[+qM0d9C1+Ci769EY;/:7[q,Vj3Wet<R'oSce)V/fg#LZIID*/86\2Mni!AUJA;^H;e9JV\X]hnY4kO5\",6hgm'ZpJ0.ljNlgp;,Pi9_WXXrJj)2&]tCgg;E+b<_$TZFlI#G).V]5>)'jV:YBt;87(_s*2kW-_HMXF(MW][PWj!O't-sO@eY,em;e2BBFp6M9rBB="7m+?IK~>endstream2042Gb!#\?#SIU'R_X]s):hCLbj:U,g3Ju?k5u_?sSC/9>1#;09gQiZ_9dJU_<R^mujssgMLKAE4<hQ4tQ<ro%\9s%iKmnYJC+\8q;g3]Y4^q#[p[t&:"kHY2S4#jbnUp^'L$s*@*=p@P:<-$&rqcBNVL!e:UU)_8)(YI?dVC)p<FY21^e)R8cY[e.Xt;17;W1A]e[GLX?nV&M?Rq8t"94h7KGS>nVXun"!GU^)(^`ZC5GWW??b2i.X(of2i&FD#D4ECl4cf=W:\@"s[QRG\+\Q">_r%(jBe6/2O4iUD][kY1Ni[-JF(kKfLqGY-,8TiPA&OMP+a=n?C3MPHbHsQIUjV//CLo=/aMAZO3gc=)cJ"QaI%!.%$P+=Hu5s/#0]j%P#C:Zn*:$X,Y&=Y%N><J-c6g.Q)*3Vo5Gh,;@7ja+B',0L^].E_h5KaFN#!ld3;e6qnd<69_VQ@+VO8roLGS-oRRc$tT2<1TF\'#p.67q7*M[iP2/rK2)@%^)G!Ys,g&@&[2tRAB&#+6]62`VEWW6g4K%-$VG2fl%PXgE,N[d;GXkh27R:Pj1GbXY"S%).rft9AgapU[%cM([15p3NG?5'Qk>N%>_]18H/Q6$!g/:(PSLj]SB/!qRB$S>f.Bb-G&4E*!+%WW@.&TJ@c](-7APMnZ+K=:g<m>]$rT)5)T\BHiJ,FHpcXb5:pSjnpt6rne5^+jXP+9O740^X`F@WU>FEk4r$*\tRWt__j%`#p,dY(X^1;E;9.7gCm:h[UKI:"'V-mKE"eYE?8PUn?.(5ntO/&IHG`n\#DS2ei_O6PtB-7RPN+"OR@NY6$AI,[jcB)L4VU5@#VN'0f8E,YFajX?qmBE:S\1SMgJp\^'?5"FN9Z*pGkdSup\4YCldJ*3m%tDLoW`c!sc]+)*C+D?K\lJg9Ep?W0Wb-kB@s1AgG*Q\F5O.^dQ-Z=A)/T1hgsIO-I4XebpI*>u^DEN2`Vn^#RG/*:amSY!/s5?!Z"Y:"d4g#5SI#eKrgS.[QKjL?>apIll](h6M&MjXb=m31EAkQh=i_5;OqJ:j!G9->^CAm1:P+eR^fgdlR)V;!7EP-iQt.=1XM+K8E&8kXmO>V;:okWID$[0$`gRho!9mr%f=/6gHYR-OTRHtojartU1K[TcJ];S;)eO^Dd*@;O)24W(p5Y6H]faQ,aKF3JBQ@5(7_o\2nT<5`OueWK*I\B`8^2,@2?[<;hk#s[KT$lrA!VXke\S\FY/u7]"/qP+@HLbIpkfHQ)h-EK6Rpe7aRaedRoG6'JC8XhesMrI(4K?1LiLZfl=%'&'b(ikN6(n3al/>>?*pd\5!k>@!qr(Z.+ZHX3P3;J^oq^#[MRd!&R*XM5K3"%L>(*Q#7Hla7G0.;V.F5C3JVS-QYGn(FkQ0gHbK29OKf+46*df5N$N!g<+5:oII6[]CX8&;k`Hs2#I<U4k]R6K@<bD:Hm*$D#C7lUL<uGJ2c#n0\I8]BX4n!An4.G%@5Ks;gM5sATf-#8BfY\<&1#:6L+%?LMmd]E0\SNFO@<M-:V,l(%Z^ok5"GY2V[7n2C9*81C;JC&\&)0gRG.6m/cN"&guV6_X#%&Tb'>,qN#bluCD=5s"b,(trQTmtYu@q6"Mg9"/%Gh!UDR\BV^;[hM71EIrtGmULOV@t!JCACS^XhQ(e!9!/j96E'8/jq]@r8*+fCkmWtdP-p>gg(?L0KuouS3flmD^Lg%U88Q2a5,oH`k!B+Y*@^#La*HN\o3N"8uknJa7m65U,d9r2NtcE4]_-[,l8Dr/A`(9"<"Ckgd`*JKV7N;N-gN32u&cuhtGIE*[=6)nPZTG^`r5O<[S^dVG@-fEJ)>ToZ#j4IYK\63_9om/:J=Z!d=nLp>'KDY~>endstream
2043endobj2043endobj
2044% 'R155': class PDFStream 2044% 'R155': class PDFStream
2045155 0 obj2045155 0 obj
2046% page stream2046% page stream
2047<< /Filter [ /ASCII85Decode2047<< /Filter [ /ASCII85Decode
2048 /FlateDecode ]2048 /FlateDecode ]
2049 /Length 2417 >>2049 /Length 2486 >>
2050stream2050stream
2051Gau`UD/\/e&H6"/s5AK:Lg)j=-2D[P$aaV2"A$-UEOPsi5>Vu(F-/kUUmh,:muEXnfM1?bE3Q39@Z%f[hECVgOnPK(5JDQc3PbM0]UJ]T#;AfemsBJMS\`A"o4QsP5P+3OUG30H'<a?dN,ai*e[)I/iqYAEd*2+%i/`WL(hPc8*Pn+RNp6-QFKVIOJnne\*h4.ifa8o5Q0)eGJOj2q.q"6%</E.<`<(MeEiMDT8@TFnin0'WK.%.0.>t_@<[;Y/$M+=2s1mtIFGtlNEQnkY;O+]%J3gi4,3C"H87c5:#I>^H4esS2D0W#\QWBPs$3S!IZ/X!s<q$fi9gt1`AX."J5aFm\_ASIA`FC-X5beAk?S`EM+nX\s`RP=P^3pA50;UF)J*I0qBIc;AiQ[@+hHJgL1Oig:UoDCtjMP0M]^n)Iot."_Yg;h)HEOT*<jt]d2[aN#//R")1Wr>sY5&BPI(^6aP(-!>aCs96KnJ1HGojW]0gh:Z=`W#fYF7TmG/\U)5t_WJN=rgd[UQpK15.6F<KS]$kV`cREcoS5$5LO9TmBn?EI0O(MN$9i[c1GU\Y]'hBf:qC3]jmf%D`bQ_K!fFF;(2l)c;P1.Ss,].cmJDnJXS>82$Gd3H<)_bF(b/C_)h('X9&hk-WGr?C=8B97^62*-8sM3e,O_DZII:.s#TmLp^HB^h75X,`4qkCY@9q\P,C@G_2Zj6N$-R[:+?;0g!CG=?Wo_ej,dMNf6Pjm!FnZg.4/'7l#-/&Vaj@#%l5BW$8_K<fj+>QS'>rActT7bh-Y>;j'Vs&-ZfE"O#lCDO@1mRrPW'COt]j&>l,qU<8kgrh0$J_p)(%A\-iKned*]!eSqU0+),a%:hepY-i'Z^/gl'80Tr9D@Oe3,t$7V4F.#$s#t`^$poQP*<+lR_'LW(;&>6fO@C_DhFhAiR71"[_&85^5aI4n_)\XiUGHf38#<#mOHD@VldI0X.LkN>rS\E!ALZl]B9>]LL/5+::1-5(+`g>3cZ2@ICXMfZZH>lh,O+s!6&.4\^u[%9s42,'>l4osd8lF\%\,(Q&JGg8,HZ3'j*KiJjqp_o=n^BS!p/'rb/c7UG$XYU@2Z\)@$HUQ-Ejge*dDaYe?$E)(8CAC-PJ,h9Ne6<[t_nlRAtL!@icD?N'[^6or\"sS7XNgPFHsjbC!'!0qTsk[%"=65'P[>Ve$q2Lg>/g-jVDtdNOe]b60>!*IiJu""0h>/Oq6$Xm4^,\r9.\7_IZYYVQYi*1sFY'!hmc)n3e&Z1).)&b37!0tT-@\QCBl69!2iK\'c@_dZQ+<CS$>*[1NFR]QasD'nB2W\.@QR1OA2K6Xh"-_3'Kp^5@Ng];C:Am^,U;.)_Q2/RA1V>oBNhl?Fg^)&X!ro\@AEMGNl##EO4@X$?%*]19SYZ^i:ScTOaTqqQs9D+V-rl"-kWu(Yn4.;1T#88\OEKt$#gRV7H5i8\:j6^H3I;aA7m@Ro_CS555^ic_HM,eGK)g]@"m\fbo9F]c/NgLESKWTd5a<e5;i]BYd`5n=],$>e`]u7gJFV[`&s/=_C?s:tS$4/k1b;B7Nn3W=S\[V'i;^oPopdFs?P4igqNV:JS^>?Khrckf"o^?l`R8(ai,+>dU]L+-R$\/+PY^bTKiEc5ji0a)V!sK7*(q-)bFBtn8j8HCp7c*nH5j4Z[*Id4-l[Jm6bJSc_4s1:lJCs:d#oL+-G+HH%M"os.+MA^<O*+/V)'=s7DK3p9b;$X,&rsm.iVE\+),BlqmR&sEUNq4mQ\9u]eBhK+6530(0m+E-J]qNr:`ioq-J^R0pKJFtU=)6\:OhKZKl*D&kc<VR"nt2fO_RT"O?GR@\:sc[UuUh`BZm(*jFH<<dlk,eG+"W(OLhh?[\%_g/sm(@a8=\aS)Hr44hs-UTsT(/qGM3,!;G5(mQCS^f8e=XKnJ!<*o-"XiS]g)?!$_H'q=Lq4=^;^lri40fgbt\1&QJ&#JDK-oYtm#U-7u!,CeafQS5PFPFWFA#R?,qp2r%"^f-H&-[\#Z?#t?,EgKGn-YF"c:VcLgA4_][qE2=;28.rl3W?9Pc_'u.5j"M`kPI;n/q=I'jH"K*d!l,nDD"s3;UPFAk`EITBLh!CnE.^g`ca^Ijc;sKX!sH1)B6SedpA\lR>AMqI\jkqHo2Au'qJSV<OU.i5F=4j'1PL0?/Hf!]\smD6+;88SsA5MJYL:3ZH(h>gDaIG91?=POCE-8,Y5T"CurJLc0`1RQ*>sOj\j%_X6W_.Yj)%AS_#'\$%]_F_L[_X+*]>WQ;&=mh?#5),u"Yoc[JG!1geYccnPmS[^os7<HSCc`ZfYOIL6lRjbalE7Ykr`mUPuK)%MCj1,cu[\r')q?a7S)OMY_7P:_PU&:2168ufoe\D5FGN.#V(Zr]Ckb;i1JE4!#eGlI%oYgcaY~>endstream2051Gb!#]rGUFK'E1-[reDG!$ulVE[J]D$.F=qd&KpK3-Jl?8;t5I&.%?,?W[*kR)"t`5Ng+'9+*NgX^fnO1.Iup%h")MHM@Ua*n(Z/:"*cbYf;Ch-?'ltspUraacf)c`J+)_&SmT__NF=X\Gb+A8N,/.]^;!K,OXak\nG%Sa[_LG!;q5]6%h7+UH:.2A0[7t^#fbq59]+0i'squfZ&HhakCsitF3mC5Hkm\C_Xr&>^9TKkpKe]miA-@qCX+uf,?Ol#*5"HUj(?AB*>l-t0;L?P$b]Mm*rj-f/V&!=qQsHYBOrqO;gp*QqiUZff3O6o5lgiQ@fX.n$Dqe2klPm>T[Z(.Q7m.=>k']dV(/;';!-B?]Zn4G(<g_Qo_QnY:8`qcYT@#m'8T(Vi=iTtms\ugq=1),[G`?Z#)>EZbgUOtHc,"NoJg#-V9<g;oYru3-"A_Ce\G-K[p_#T5$p@3A+AN4V'Ro;kn8V$6Z%K*nZ/)<:f/WD-p`oV?UfZAliW$/[lM`ODb&MRA8W$Ba'?;S>^\.k_^C8`T@ebg!(t_Nd"#NZLmVu)1?1(K3EIapWl8PF9Jp35J7:rlJE#-$9G+L-r:SQV6&*/Ga?[]73p`0p9LX$3(+5i-PiKV:"&*5D/ONWt'GZV.$qo]`jHKsd+)^6Cf?+`X.[KU/WNOj3gOWR;k13q[((bL9&4r:A873T6^s_1(:t-S:5/TK5^l=4SIUiTL<TJn8KLNCpU<,"19k,9?.hpU6,dOGWogPS"V21FW=rbm"q<B,SG[WO3C@We^p`;h\,L[RK/!sIWEW`TiZ+;&eTb'_n":!ELTYdqr_:OjN"h]-P#"1p;Jee:CBOa7ui-=@O\+CKDJjX;r8N[d/n!BVteo0d(Dj0purTnr8c?1kglGcEgAB)kCb=&r:N%*3+rdPJhRlc(OJPje$'1rMGlZjPait3fLP@?*8FhL;_Y.7l%LWF/8KQ,@?/351\>WFJ/=RfKP=_JJua::h-V%^G<FW._Z"2m<k^rAK0du%gq6u.h.DOm>gj+`ZP$95@+-Ml.YkK.<Mo0jChN(g4@FZ<RQLW[`O:6RJXA@J)O8jfY3=H2lB'J+C`K9fRaTiI+U'HC\#@grq&b7,R4ZngZDZm+ng+n8WlS$Qrt`/5`OJ]DEM.Wb-8)q9UR"m5.WG@LM=10tSNBH7qR*8'Fb-aB)BUCLl#;BerK+p'=G8q\M,nl&;LZ:qiW#ce6TFHNlJP,;cLW$-3R*XgE2h(V?g<cL?e=$4?E8qf_(=d_%q^?>9GiF[.8`7N?``%\;+/"3a5Md.*@"0'Xl8lK9doX4ZTAJ2NcEZ8+abSaFjda8`<s4b@O@?;+lAahpcU2\(lIF*_$'.b@SWqQk$LJ1&aYMl"khd_oWRDCnCon.='bQju?\s/mF2!`U*I$=gm<IO[r>a\7]nl]L3WSs&ZKE$=1i)4/8L<jm,UJ'(d;i8^lV]b6ePsI['MW&<4KiIO.e"8:CJThq]fkL^djt)Rl'%J4dGo,L]jooLY`I]<2i])L4CeA8PQqb1FG_EG_S/rN(0hpc3G*N;m=,NHc)eU<E*sS-XEI>o,c.`sjNi/o<FW'f??q;_HY[$(Q?eVJ,URL!!P95C,A.\shkoBn%N<(X&80`<.R4CQ?!?E2*Jk+==1d6BeF:QU7nrU1("i<^)XgV.jE](d63"^=G0(YirKpe^):trK3gY(Q%F';K#C$_V+0Wgb1bmdQ09$<T'a,l]N$*r"#,Ld=rT=Z<c3DW8ifQD=APsnB#!s.EG;GK9j/d\A8+lEj/p7_>'X<'A/MP@Z91>Q_GHBZI2>>-S)L.&M]X6bgQE$<taLYWnlQIhdZ]`"%YBl/4#pKU3\'R7c;JY>#K55`njN]/hU_Oc;OOGg/)`!o4o6s)0pKsEOWp/2p6UU,%Dr("fP$-J.VQWVVPk*X.=-dOY9bIs=!23e<q`_S.8#L`U3B;>E9#@BB-HaQrTa08Lp`&oS=;`5"e,a#5,l\qI.pr?_I>]Q&keq"g>RM[q-4h<8rZ>jA*h+;O?fA@k\?$!OoL[JjRDn,%TLV4^oTpcO:HYF[YD5(<KY_=:WroDu+cD]L`n$#2C!6sL50O&Pe-dS^V2o)9=Im.qG;FB$(a/@E"J,FmSFB^>j&l&mUr<`\^FG&C:F_ti]FPEa1Nc+K@PP46#rL0RL[X!0C<l5^n\=9]Hf:!U#HZ<;CL&+h$a.$ETq>J,>Msi,X[O67@8fC;bfFHYS>ES5oT$R/OOdk?)Tt.s#;PCL3meTh!DZH9enH[sEA66S2ZeWso5([!YlM.tBgXXDP9<iq/;8$#2hEKU^IcVK^0u3=@'JLGS)rQ1]Ght>[rYiLPYHDg(LJL&0(R,uXB)dJ2XoEjUid91/;120S&1Z(uZOku"SA?LI\Dhc+>W'4#]&2n%PMooZDI`'n/%l0?=EMf"CIW@-flsJP(gttJ*Ec%c=:/,F^:NsnIY\gOCj4[G5`=:Thq9jQn,3]:U/S;~>endstream
2052endobj2052endobj
2053% 'R156': class PDFStream 2053% 'R156': class PDFStream
2054156 0 obj2054156 0 obj
2055% page stream2055% page stream
2056<< /Filter [ /ASCII85Decode2056<< /Filter [ /ASCII85Decode
2057 /FlateDecode ]2057 /FlateDecode ]
2058 /Length 1781 >>2058 /Length 1735 >>
2059stream2059stream
2060Gb!#\D/\/e&H3^ns5D=BQnu70.*Jp/!<nX`!BOaoQ?akcp^8ZN1)iea81Le:lZ].8a)M_Bb$8>"0l38j4$IuYSi[O'nX%n[-jM`&_!sDcikZl@i]B=t0&YdNnDO$0J2D%3+cO(\$,U\<HO^R8]TOfX18e<^pkh[iGi7;P1-I`bK<'DG"E3@ojW&]-+>b];-Sulj):JqYU&n?#LaPi_MZmbpZ\iBM:l+XV:,D&=-=:3P1RS1`i6M]TQ*)Bbb:9,=H/?I_+j-`]Yi&XgRbfanSOZR+Om%!]0/Eg/>umnh7;Il!8i%C'4*^A7g]#s:Y2d*3J1LDBnc]k1*"D3o/b"IpFYF#l59E0Z##<ec+r:Y/#+sjAHq\K69;"0um4">II42+CHM#D+0S8iIEP$r[#hF!3h5=tj&.jbub#tF;k+VjP,qm^2dI&\ThspDp`Wpj/fCui[JRIj>YMe\%#b4f3+Bd1[*@RMGfb.t$At1:uQ[4[je12GVeF!<lIeRC<a:pB+g<,Yr\3"-6"&k#&+3*^!R0U_H)&W\"k91Thj)GeNoHYr@e/=f;)4ro<'7$F"VSG5T551KT]j/KU`jWa/'Zk;6go&G7B;5<`Y.7kJI4?F^Ht@1%R%P;U&CCnSaeVAf;(6c191\cD5DC860p(pTf];o$@bN?eki)DkmL^R&`:KUU8$Sl4/1/$F9I_@;a:;$f]S4F7'hM`_\;:?hFW?l=lGH<:Qq;[h;jm3N%noK/pj+$sTmiZ!:e]%V`A2p5Z\ecETqJG!0;,S/'rddWB*?5hhg<UE8.)b2M/8>K+aZpcdpA8qk[qXGRiZ#6D_,CIiQ""R@q3i4j.gZXJ8n$*8u/EmAIWSH;mIDc.SS"R(nLr^7GhJ-0MF8)<[DP9cDE>0&E\Xl/m2ZqGG6@c9esf#1(H7X26)IT8rDE,&7m:)f?DsXa*Q[]]&'l42D4AeBsGQHOmK$-.>o9?p&"LP[i%^($NV"NdYHt'j73kqlBRAg4aOKknS/0gbEnU[KDUTB\!rXHK[1SE>O%bT2O*_re[nMN.4Wd3MVV[QTp"5ih$*X5r1ZUg$RuPU5*7[7$R'HbJ;Ft=Rn$O\*e.(L2*4DKh9`Ml^2T\g=Z6m.(9lV+D\/#ur=e0IG(M)m3[oT-e#\?[<t^Ms5VGcBg.?sL(L2%*o-LWqMIWr#m4kTDQHE&CX.EQpljL8E&b_o#(69cb`?!^AVLA]O@89N[>=at1W&o&4mlmiqlqq@qXU#-aoH?f,bR=]OHai]r(P8f,FYhqqfDPq"jf2-e+[o;['"g:U&q#HMXhJd.LW1Y;CsX*S4Ftd]'4-WY(QQ(>8Lluj[LG>;Z_e0SDrc%Rn+-P0=^rGToX>bd_bkV)[oBHT=Bb_Q,1_?un%EHshfC16iO$B"$!?-U)br4Vdn1"<`;^&e0L5k`pEK6P-ZV\=SZ`]RJg7PpHEmL0,mg*iMFjT'4ItdA1Tq@ZOR.Udrk6J!Q;B"8Y&"Jrh;c'K0HW0u;4)1HXYUO)3I-)\A[li2GrG'/D>YP:)"02M,#R,MBktlQ)/pf&W:l%mmN=WAO3(oB5NCuWG3[`%[[eKfo%166cg$N.'sR^B@'_m-<=r/d6\O]&0%\%u):3VAfK0H6MT#g77[J9T6J%='U[qMCWj:uEL4)fY!92_q[,1'sm=rfH#GZ;16jFamFDFLi"eEKOeL.k=$'Pcjl)*^)h*08(*"7IT2BJ)+:t=ohk.R]V2m#[^6Z:n-,AX9hQGHo=I!HlTK"sM0YYPUP=(i3CrN/H)iPE8A602h~>endstream2060Gau`Tmr-r=&H*Xms21Pd0P>>>8X<n4!s0`P!u/hfXE.5Qn/#9&,W:mcOAoKRYMYK5n&0C>3EQn2YpA0HTAI8*Op<W=HM0-D!Nq/rIdM^L__;0GDupm5_#**Tao1I\2nQL?6U(u"2]foIk4I`T>=gUo9;4:<Di#a;-a(-^k,0RDE5&IkJJ5r*`!h'M9nM#F^Oa\7?jcCa5Y`gZ#m\cH6;OQU"@\/@$KhhPhdH5cXlcfW"U2'h+'Oc<W$biR#Oj+;)/qmi;+FKTFWk7bIO$3[Sc,k+&jLJij$>Kd<!#s[1aT7\d7dN4Zt*0#3nmqpk;q#<!E%p/*XYFp#bCbj#:,2?_^W2>&Bi<6P.a+KdGZ'n"X&-iAJt4]g[1D.?Jd"f^Q).l9ZD?dd#k[N;KFU:3#asNqP=7_nbh+5XltunD)g@Mj)HMSDb8CS/I6SU%%M!hDGWcqTY-#f(9![BD!E0D$7X@:AYh^rBbZho8OfbF:LQSe%X_;6L%,k!5p;Sj/m+k1ol`*I`1@6[\#DEL[L`r._qD_g<kiXK'`:]><YBjELNb\Z_Q\N7V^&-(dbm\r3RnJ6U&e8(+k[P:0``k6gb><DQt]d]!ZHuaBo#F')Vmpk+73?9e.7DleqA#QRbUd8K-aDDOm.'^:H=-_?</ZJ2pka(1aOT`K/Z$-mCn#73j/A"\AX`WY<[qR(g%TM_@NMe]0dG18%_FbhJ\%jjUdih:B3^G5,N,0;uf8O]&S'I9A*ru28F)ifGp$S>7e:gf_u6n6Dc/3f%AoVXuXDVYG\rs<+ak2JtmK*)#%@Q2V4?@`o$JE-&>m#.`Z0ocl4OZpeOqQ;c,HAnWu:*i3*QZ4.Kaf!1tu'do4bo.P][Zk*CNHMBWN:%\095\^R/(/,=a?bZWEaUG;j0qhGYG?/:H#ofd]sIK/dD&09(-Sq]b_XPjp.<adB+P%nM4Vugl\10>iceLbY_6a]Zfdn!a]$^maDG+g0:B2obH:)<>AhLA&qct9:ZGWEqE"5s[m9L;!'2'0P@S6!0Q^c)H2/D#?FBI&jH>`!9[kk12mCXbqc8F@fuiUCOjgd]<__QRhFV^@uq'4>k9J4W0`8tq.kAH?`46ag,>3_[g?...;q75#1S"=DoSe]9YWZPlM5K\<%O,b5+WQ"Z#4O;(<a9Z#>d`YD@KUaYUFU992ZRbIO[>AH68lHRsniRE=A(-AT3ac?@fdraEG0.nk8)<WT*!6)h@_X)4&n.VkV.ij+]p1V"s[fO^pkCi&N]-W>]=HkGVgB5EAoZdtn7iIAtaE)I!Q\h:%YINZP@X!I8%DU*q4<_!cs"=T1/mop_A8Db4>'p0=!M?Km8TI>lrUkHV1s'ok\?USOQ9B0E*^2gUG^R$&J:?,F9RsfcSn:8aCMLj\KS!2t1[O]^d//Q+Z_@)[elPf3.#k5S(DQb(UN1s-.*CP[Unr=/S'f`h^bcbDkh/@m`^\i77(R`SrU:P.Bjd(03@*?p1LB,`o2Q!l[d%J?3H+'kaQg<4UQ?ZK>79:n<=lm]Lt:Fmk<m^>O#`lXB_)?f$Vu"25$mjg001Y$BCKU$R_8^3hD&A\Zs@/Sci*S\9]F,)\K;hjZ+cm<r`LQ>#or;9e/i(,hkKu=GGm$sq`aWWZf)g$i4NRTj+`NOo(E05U)B41A$:Vn=WR9g1Pin]4iWomJSN2#aEc<Jp=`Lm5*DZ#okgMX0b/]:jmlp-M'Dg.D6r#,7-MT/RtfCUIfV9pcKG~>endstream
2061endobj2061endobj
2062% 'R157': class PDFStream 2062% 'R157': class PDFStream
2063157 0 obj2063157 0 obj
2064% page stream2064% page stream
2065<< /Filter [ /ASCII85Decode2065<< /Filter [ /ASCII85Decode
2066 /FlateDecode ]2066 /FlateDecode ]
2067 /Length 1752 >>2067 /Length 1650 >>
2068stream2068stream
2069Gau0DCN%rc'`B'qs5ADEjp\8iLF(."3Zr,tTNdjrNNllAJUj&hA1eMVP#PWZfC+lOHVGI`8qI1p:m^@:H[$Y)_4tApr_G%pZOskLbm-I`;%A'4mDJ,hhN*\X4s(mBbI)s*##XH-aY9E$NfSY!P*jk,@Tm8b`?[N/o'B7W*$:;/J%^W,^o3t:,"R[k`4Wj8?A:IND#S'rK6T?CboN`&aMoTG:13]IN./&4rq[^k^?5];1&/j/`*aC77,:B7>\GZbK#F'FKgKiX(iW=7n:fd\n?EaI4U4Fc^@`L3S[sm"$mN1<.9/Bp8tR':r]qlf0D#2T=ha(=h2s"PC-j2r2JrkD%=3m>@-0iJ`h7@.`fb%bO(QN&9E6g0%mBAYXRRubP>2uG:g`OI.(a")Wc@J=>B/Z3QhSC6NI.CSXA57BoL*fN!gJurXRXEm0]KUU_Oj'r.9KB<8k%gMQgY;Y&]X52qZJCOVmY#+KG""HV>11/G_;%*mhQjZe.E.B/p$N'q1o6-NcQaQ(W^2ac`^1cFI?Jle0lh"&9n\"L+1G/Ai?P"1ai[b3l.8jV;Q*kVaT.4Y3AUL37e)%_u0A6A4j[@UBmu"k=jn:VS]R\gj3hY@3nuCc_[mG)@2BKn<4@2.aX5R%*Pqr:LTYQ[O*%0N#/phC`#B)"7<fT`>K9W1GfG)@'QZEbHAj6XdY*4/CffulR,8Zq0(#Fg4X-*efgLYK<W$i+/\;5$)SdR4&!.73_[?7:fCRI$mTM`+0d!R&3]u@HRZ]04i+A?r4A\95m..A.pi!:3bVu:XkN4-#`$;-'C:SdQ*Si&USf*$0R:Zcp&[VjShZr[-3Ejh)JO8)_WVj>faDcJJ&Xm"TF,%t+.*,s0ce2LCMuHY6h"CM2h<Z2$![$Op<[E5>"hn8VG(MHg:F*<$`?Ij=]_4:.n_rWin'Fk#FM`i?j4EWVg4!cXer8<<n*9K;[nW?'=IIhBn=hn'W/:Ze7'=<T9p4t-C`G$Bu88ne0Uf/!CjF22-/LC(:?FoCM7E:LI*36jW"u<Au4b''Q?croF<el-AP9G>u1IN`Wn!!;NO+a#BkAi\s>_i,DJ*8%#,%tB4Z^1%>0jYaLEF<1`&mB.$.+6*TYVK+oQZ"k8R%<CHi+'Kh#@n05Ok!B'72+75L*:b%Cnr:rFq*_m/aK1^"1fkA)Rp*;#o2:h@pMUhs/h!MuKs.4l(kO$oA_)KM0&RVZfEA\Omh)@4:7f(d#'gYW^&mH/9E13"qpZH8%>XQto8p_;I=pRV3<--=6>.AlG0`kB?[^^878Zf^q[HbQhM>tC1XqB;&"/o+"UG!j;bE2K`Wn#9MHO^?gbOT24=q%'09]9S5.Bs>#c2R`%Aj<eIp-FH^r#;X9;*IL.^9`RU^n]^Jp6IosNmKpsUP9"_B=[pnHaZ=Y)>2sFV!cD,>C[iW`W[S4[<MPC">7.2n3aUL")0c<bSMbKj=[QPb].HJ*-e$(4NR_jEC=7]RWasX*A+5E>7O1lOpZimA_08/9PC#6q[R@ZY9j)GE\(%&,hE(:\]$K-c,tbRX38QCfZ-MS2V+[L69j3[q+%TN7c?V^XPEg+4^V8CqH$uIOCgN].-5,bf8kkOOp/,X(VS*-B_>!:JBX#&Mh+EQWJ<K0&b#;X5IDQk]c519uVcOtu'BU]?UcWY=f$jSjmgeA+hR+N/NKR#kP#"c@5%EgtS^VF#@^5Oq(8?C/#i/lr/M01;iHf.?+S"8I[UYrcjiX+kE4G'f*$>+aKtH$X~>endstream2069Gb!#]D/\/e&H3^ns5C[#EsGLk]AsG"YVZa7,0dF5^bEQ2B^'&CPpr&qP.JDWG>rB+l"\1h!mEq5b9D5X4ZqSj4E0Q2Ze'!sE&NF%(ERfb9FL>V-\U_1r'!8,q0[MJh2b9.8>=1Fdn*/Q:/?>K<`mjd-&f\<=t"B:inC)@EI'qZDWc9o3%7O&,U%`'"f-Nq$)?0Eer\KdZU/AZ.;K7DW)>6[Y?o';+.3%<1&UhVN6l_F@pul/'[^D)5bB#(W+C^iOiFC<h[(S\N*d(Tn09;C(.SoH9h.=&pFncq;*&)^?GZbM?_k'</9)%+7LIbT16n4g<B57Kj0-a^6*Lu/?hj@O7]SRg.XZj.>:?K6`"/L\Bb9a<.,[cUW.*5mQ&DKL6bYn4OKqJl4U1gn;!+._Hio@OJ9^7t)Ql#2=\G4*\#*CR[%Nsbe8aiNK@ppmd`'c4Cm9.s:E90t*iH**\#9_&)QqAZ/3r1WVBg<pK*[V@%hgHX0,J8QXEN*m^[E7oI_N##6IR=h<IKW0k&hniTf+#M#e8S+p0g4(Z8^[7\9P%mR4Z&(LaN,k<nPM`ZX3B;,>-DEc1<%s\_-gWr.Xo[2VO*u229C$'#h]Wf%EVe.1Inc(@ln]20iDHZ4%6.!q$?N(d?I?NB;l/K5Wkm3@9+<7%V1&e)N%U+B:k0ZoMd5r^NT;0>;Ul'a2RHn+Xqec"^!!eTTh,]+qZj()[(m2iMKF1fb<nDNT^e(D;NYDrS?`Z$PZM5'MS?`oKP@Pus`/`d)XCs$JP/Ai$[kD2BAC2To`2&LQIuNjq"_d:?YZgJW$tU`ARnL(T1!OH-h0)hC)TqgH9";:a\p6i,`tI(8U[5.8t-.+Z`=Y<a'9l!JKgW)f`_cIMP*Za(u.X^ra\%4]6'F0HXm[M^\do9p`C_cRRr5l^\H;f=X21niHg1PZI;U3K5dHGeg"WmjG_1R".JoNn1['R>.7,2/F:BeXuuA:[;"GG1C>S6r8p6'/TiU[NV3@it#KDNr5d@<eA&TYK<&V"\*CP1<!b5Nu$p%:;X&Bod;9P7HHR1Sd>Q,r;:)p9Us146_TK<+mpM:Xl.Cl_LGTU&;K=]g17B8'n#%HN?2**p$QQ*BFiKLSJK&)n/=c2EVT.Udp9m9a$o_DWI0@j!?hqZ5;FGmST*h7,b3<Nio2.4Gf,Y]a4kds&=H^&"JrA2H@"p2K*q_*,q31jqU5;M7Y8e:MG!gB-aM"QAbMaU\"TL@^-IPK\=Fil+Y`5<7l_9>CN6a/MTo5E!E[R6Xs0?>dq]IlkNTp26Ek3hB;2TP>RKrg&[S(.*AS_Ft@s#K#Z0a`<I(bKrHu'bLO2`Ue='hkb%9^^VQ]Wa4FVUDqB5(0igloB/>:_]P(4o,(pmdqZ[-9!One<;"%eVZo$j?-?W!2S%@"?KHrTLURrq+EBVo`9)6*^#@=IYKDFogG$1-dE*BUqCWspY,6QY=$\p`S/N=hc<Sd"BiU*:pb!K*^aH4>V[0,td=]8HE80<PiVD4mLmCIa^IJ3>"!1mt5+8FTW#7p/OnKF;o>),[-2Yq+acBhuM^KnU,O'&&AR6=1,*m>,md$_gLr-42k]kbo<efsuZ3^6k;[Z\=Ied<UnS5j$"])SmaRn'c3DILSoVdlQ.1Q0*1M:-?hnh7++KF.~>endstream
2070endobj2070endobj
2071% 'R158': class PDFStream 2071% 'R158': class PDFStream
2072158 0 obj2072158 0 obj
2073% page stream2073% page stream
2074<< /Filter [ /ASCII85Decode2074<< /Filter [ /ASCII85Decode
2075 /FlateDecode ]2075 /FlateDecode ]
2076 /Length 1567 >>2076 /Length 1645 >>
2077stream2077stream
2078Gau0DD/\E'&H7^.J!_lh8OXWsJmVEP;K=$_X!<r8:/rPb[+GJjnI)h<c8DWmh`JFS!e^Z.P+[?AZSSr65!/A;9k_qteF-fQE7K`M)\YmQqI;3"_h%f"\F.sahs*(?DX7,F%U?pE"/!T_CHpWp*9TFq;IXag331Y7g6>Cu20-2DBDQ#E"+sjV'Z:)\`UF=DKkQ#54,#cWBe84D\P"tW,01`n#`RW]4f=>iHbp%V0gd!/9SaAGrr`4,5lEWF7XOZ2]BmO?c9ZnLp)%G+%9$oaPbMMS&\1Y6:@h#lE#>IYiNPli;^SBZiHFhY=WU>sM=Hsm&o<.*o,7L#H-7X'RR]eugIDU8*VS8fTA;Vn;gn=hN%\)]aOf9,[CcdCVo<K$f%LOX'E:]K8&YUEXWU"a=e*<nn]A:q"PF3T.BqHrkaui%2anq^lt8W*:F7K#S7b1#'%<@D?qJQFkQQNrV$ImHSTSQF/;jeW#tc@TAP6RQo%V_epLY8^/0QEEp*e2emW4>YiHL<L/IW@Ws*DRZh_b6u);5/27`E[H>BWIq"r9X[L;7?TKSVdL_9)N@,[AZ/*L_ZK0!j3_,8=F=<SWH;ZX9C;#T6C)N1U[@9]?2c^+G5)j=HP-dq`0Bp$NZN8Y0@IdU%<;cZ%_O+-*Yb):](b6:?>8[B^>e*ts37,3H24lqYa0%^0bsEM8YuLe>iPS@X&E;8n>h!8=8jU4@N(Rl`EG!rHs9<WV4'pi"*kC2c/(IlL*q_Qgn,j,BbK9N$5ap^gN@;f5=&P'kYl6GL;DZO&$I@s=BEI5mRo@s'dMEI=dBR,]:6hn=iJJ-/JX'/S/Bb'm6-:*Ai-FKV:c^f>s1[QgE[04DJh<`BYf1O.5L]`g7K(:Sl1.2>*m$%9'#Z^11`F^&@Qe42C/Cd30jg-#[5M3-P%4m-<iZa`>bM3t:1+;R]N[:/EUUMV&@T>5Din`P`T"c5bOBCspB8LMNXXbA;4Mko-]nZ-b1W>gG,Whg]*OG[OqZ9*?dr;]/m(4@'9@9\jkQMLMp5es$iaoOh\e>Z\ha]'Rp4.k(9LRe=AHn/=),abC(6+ILD.l]l>rYV%h,9m5WLIFg8W2,K9S/U>DA9SsK&TW%J+QJgsFUgHg/!bO8F?PF13j%[XZ(*&7m!`cXPAY;6QZ9U'.]2#cMCO2OK0iOtLEq=:kk9,EU18sV91i&nGtFZ?nbMY4iC+h/:O`HSU3K#&q:24B%((jHE4-[,?XVhYj/sZ.[TbKN^'V*R7*7ic.#Xp(;.k7C:j(bTe*bCO]XN+L[^o[@,+LE2Z6J\G+NF8.c>39Wm+F.P:?TkQ[dd'0G$ZQ6Q]k:H64MS'?Wnu?D$J`t@i`t1.^JeaYM,:#>=UND$3H1]9$in.NatA-GtRSCfA8VS;IJ=e:?V!&@:sn;DGHf#0bAc-8mLjk#=SN$c6eeJP<!FK>](jTB7Uj%jmK%6NI.2W>^g90\@h\@mW"2]3l<g!XGh<R`sCJ/]C(;e*sil(8N]mH'kT"EA<Sku=W)MAU/F$9gP4g(:\3HVkcMh0I+*%?FjtPUPWSG,Wchn#:p9g.38%I&~>endstream2078Gau0DD,91]&H7^.J!_lh6PXut8Sj1U.WGWl]A@NAU7t8BU:!-Z>jSk:G9,W!GBTM[SBL!t5nLjXl^;CWH$3fN%bUF6R.n)jpb7AF(CiDW$r_+k<Y'qWiI#lpnEo_\RBI&dkde.`LP(]V3B[*$8mkh[JglDq'bfs'^c"j)jR@[.0(*dIn@ZJ(V@.DW5cB*a<iB;G(s&*+9L-NA-;\aX`&K_^E!Eaf*Pq50)#aU5\+:-RZNMnga8ClF"Msj9-"K-`lNCYG3?HPJlZA]F&U^h^Yg+gs;c2,0l,$80e7mLD>u.ZPCYkUcB.ZnkTjud!Rt+h3-,`aBYRC4;A#77)_@2.B#W8fD#_`G$ROT$0_':]YThM/G#gm/*er5HeX<gh>W/Mqq8>\.k#PSKY73@k$AdMV^'M-3;*8<m6<nK0ORNt;WPpfQ=DA6,MjD`:_<Uub.aEg1?Q,ZA:!nOR["fc:)[*6<?'P12*#csmV"UL?\UthD('c*'D`f;NC:cU&#KY_T8eVAL's8*/E?k(15$La;3jsXEcU]ECqZQpEL]6#4^BKVl]PUhLeQJjK.P,2=*)DcGuj=5J/^MoKY36NZCW1taaboTV\@nt\:fCTjKY5<<d)FX^??&8*8j!or*NE7M8b0Vq1P)"kGUGo#<&E/kuaK_fs'QMFZC*<Iu+;lO:e31+LN)*K?p/\jcI*SDt@<#.%bY=LqNlUIPT3#Sd2=f4rlI+N>X+hL_i[4Qgn!'crfOJ"_rDIYn2-9g@`da'pDd@$f*D_a^C3?YjlLH-Gcj?d$7MRWb`@-dZ7mi<<C,X[iTV&Lk0'_oDhZuo=X;+PP@1l7#J?o=9rT.2:(]`S&EB-<R)c5KuPKX!W#(9EYS?\T_AGf2o!*kkX4Mm]lOY7L8P5=os<RpMAiP&=B#$jN;7I@Q7W^`Ug$FH'f*Jo&VF=g!Q-Q>?r"0-VCK(/[aMUf;0,fZt;<^N>TC.\]N$161Z;U&6%U!fpTVQI!(Mq)EaJT&*&cB6f;%80q$nK"\)HMe%J[GY"7%"s9>+_gH`FiU.e5f-clQ-HOZrr*p`.kd-t*Ehp&rM@,k'jZb(!\h.r$96(tZPeT5m'#;PLhJidNc`qAr[Q_ra+=DE't%T5MV<^ALU;)?)Ae\"pN@@-286!9#uteYK^"6-r`\0LX/:73`g@^Tqs/GVA'`3sB$b()3<I1-&4E6A9.-/h6ej<$on,3%dnACIW>4ek>0hQ?>.oYIdh^PuQ09ZIplacK4(iI+#'J[>VPfIqq/X."XPIrloFS=UXYU7?VDcU.87Niah&YRNaZhYAD0.a's$cJr=T0ZGbZJ3#&4tqN:S"*>`([Wt3on8&hJC'qBlqhNXl]aGlHjhC(mp\,#4L;b+=Q<mf@15;].(neoj<1eOE?.m`W9P#VGjnTP(a+K)3=NDKDB[k^==cA$;=<3:i0d`H,233@qJ1N:'5#Ef*,0J7Qs]VC4N(SbqSK#N3c^p8M_O_3G:(JKP#66r3t.4J[Iotjp@)=]U1'/mc+&f1REY#_-kV8NuWAHZ(f^qB,8>JeOR-h'WDbaX`=!dh*&5[%K*rt[NUThS4-JM7=*Cc=FA.9/L.pu4<GgVke!GJ#0,*hZQ*jd^>.)?I%RA)pPbFhZ:LmlQ([+*i."$*r,h~>endstream
2079endobj2079endobj
2080% 'R159': class PDFStream 2080% 'R159': class PDFStream
2081159 0 obj2081159 0 obj
2082% page stream2082% page stream
2083<< /Filter [ /ASCII85Decode2083<< /Filter [ /ASCII85Decode
2084 /FlateDecode ]2084 /FlateDecode ]
2085 /Length 1852 >>2085 /Length 1576 >>
2086stream2086stream
2087Gau0DD/\/e&H3^ns5C[#Es>,H-!?Q2/T"[a6eZ+R\"T2`JX0u;S)-V4l.fX\4%as;>"^an'khHN\iW*'Gk]uJE:FIFJ&aRbb:25Z@DG!m/q=+#!7Q:>4h\N'p[WpDCW@$G7jH'6-5!t5H1Ae)&rTZLg_c/9E5aI`>e<t3QPX=SrLP*_'>ZLq%qCF:5t'W!@A&:Q<<3Cb!k8GOPUo^o"U*G69Vm<*i!Or1#`Y;inF#,Wh;-='I'-lR2b\_,1&h"pbeSA6A&ECI;3(@F"FLie!3,DjY<HAcZ[inF@WqG(E"jjF_@s_R38lgD8q[d+Q\>FM!*tF`/u2#VN221:K<np>d,7Mu)H@04%G:"S9!s\&Yi(qHTAA2Ni>oGPM9_,k`jNA;X'ZY2b/,_,@2VPpo+OpS:lp,V-l69W!cj0SW$i#u;PCmaY'kIQZEa-4>g(9WBB"n.eJ"Y(fEoiY;#)N(P)2G+OB]7Lb;')s6B/odQ*l2N4l?qu?k[=&7h<WWGfS]t:9="2B]P/6-Zh;,T$W3t1[f9*bWh]FrK+O[c]rbALW='@*DbN:nDN53a%J6(A*O,5,Epp(Z5A18KEFG[r:EJ&LEK:W*0)oIO!f0:aPQMnoE6_(:<Mh7!%Ta^/M8n^.uTC%5'6rant.(0(M"eT?Wqu7T^fI#$1%`9T:@]Ga(9f.agB>B&N+RaTl`76LDN'?H<.[L2h5<7d%,-cmTHs5LIO;o-5%e8><I"Ko.m;)"$lR$;@]2]T4>R(UYmUM?(ih%H1`l-JnXcb"Ddh_lhUcpG"u)caaoaH/7?cN5A;V\UG(j1!?2*0\F/=+7c?/M9+)A'48eB^-",meroi7^Ts'a/i>B3@jDH%fG%BU:/bWIhYS2+o2]PPXrf`6:?O-Q,P7uG\+"5uaDX&.$mG7.2`?1^K57aP4*lk!1HJ?+jWOZa&DUqEn2H\q%k=K,e&286lD)1ebs49.[(0SiQ+ZPM2d?aR&'8g`NGdkBBcur<XO9R(3h!aiN2CM0gb.,_c@B<(9dHn`f4/(5KiaKtYSQ3GCm'@AJD"#3U;jnhsp6bKsTY/D-)&2,2pAi!eK(Fo>[bo,TnS+IF9EQJ-_E80MjB4(5&P6M,ke2(E*A6V`3&tJGIt\oNL2ECER#kG,Nl.W>ZO#2Cr!l2#cSQ9nc'ZGlf*#P%)bS-s09WE9oGTndCi/K4h`B[uAs9q'0,D'FcI8#U1b:@:(\"7PKXM<5A@b/larg/&i\*-:g"=XQokL3?bt`P&!@?H!%AE;ef.e>Ccm[5;<**TR8Rq(''Y"@6VCP3&i$M[%9$+,m#!R:?QuqS^fVSu1&9[-)PI<C+@L?->mK\s@4tbQRe@:]9/2fXA!R]>.'8@chR7N=l0s[b$>&OT-o`QA'\VqZ-ccku`Z_O)c)r&ppH,^s?W%b-gZD,Er^c!1LR!+%hg9%M9<p2O47:ehd$Q`f1"RFkEQCYP2/.T03-(r+4\6X25hqI#SqF!Y'!Q8eEipGe"4!$hrMjW<Uh5NB7';C*7qN)/#X@=#m[=a]@AXtGt.U07!)u?q!f%f%AGC,qJ656erQRKhc0*+.HE]CEGX;^JWh2eFs0'[g:'^l!E5qTK_dt+CfTZPF'L<8!k=-Ck1ilVgRhU46Yp]itj7'-GO<@nm$'o?c%4St"$XqU2j]1iokmQm*G#<j&'/O]\inB@-9O3":]`L&4rktK^"8M`AQRK`&nfa$ZnJ[;g,2t,PnZ%r.KbtWH5Z/qrWAa]@6DBI`P#F[g_<:7AqGMWh6n!f!*E8QDU2DRI?1-*C:k7s'X60dhU.2pO7K$:KPoGqjd/[`?)n8Zd@(GR9GWQP[NQNn^UnFbEF/hd2/2p<[b~>endstream2087GauHL?#T!t&:I(.5KlbH;M!m$2gM?DDePqIiASB2LT'iRZ.HpR5H)9VMH9JdGBRi-8Vh47.$5-ua#h=sZSQ6[J;QQZrcTN:cZ?V1,=")Qq`kS/JGDA+4R`%Dme96aCHGpnVP6+]#OgpOIX"DOT;3(\S9YW%V>Zu86do&MLC98n%`O!EKF(=k`;5MhHk-=pQcFKp(R`PaK8bN`d#[t]lK/H9J&2%Q$0(]g3%REuN)O`[(6!+Lb+[IC;"FK,$sjcEBAcY4@$:ca$MZE038p),8\Dqtq"O%;]0JS!r<+$`_(+BIAMgLna:Jqk*"A:X"_9l_`;CKdQH)ulVXK\hct\4B&J9,q9\F33^qF3nQq$EbFS`\6n,68!/?\h8RW3;=O[thF'GCGu%?hF=8%8Ag,>U%^]R,P$*S%qsq(V(4@D4Ji,&VXh5E?Sr`r_:%7WT:06L&tMeD$p,U+8tDjmGCHd;@&$-B3)[,4ugLKk>rSga#44iGhoV]7K5=H8<$[HE)[3NlMsji/b3K(*hUO4/P]l:pg7R.:Z=pcXV>[0kQD@01CkZ"kc&6lR.A8Ot=N;,cgG?p!@3YoqNXA&GV?hR2bo%mR>5pO?n]\jG+o>]ZNj7DAXo/A8qcE=m15OB&__5ii;taFE.EDKf%g'])BmGMH\Jl94FH!GaX5jX*gY@m-A3oF1/qPX#VDqe0@o6"gf$l/e-L)>cJf3L1?c\83^]7H"C\.GRS:PD+0CJ-Q_a[)_cn]Z:SJa)))0sQt%`ABK\hSSA$3d\Vf+aa>!#1"l1`)GHrA:U=B?#[+"^'NepQ[FL:*rZTEH@[X:ou8#:"SgEEq@6O4C'^onI0h6H&Q(jD6kX@0[N;ijhjTM&uhR#Z(WlrG:1R)>)R%8F<pRl#WH8<E9'(T>oi=<n=S.0phYL:\I1?kZD'F3]C)-8?8]?6g>@.*"22lVNY[lnF\]P*47<[3l+S8(L4d2En/XpmO8lRNiF3X5kMKG?u+s>QGE%8&@:Q]75M4DMa)u(?Gm?606Z%JWWT!RY@?eD*M#`VlIZo#<5Sl%$hV!$Z@?8k`+5E5__PDW`fd$F3G$5.q?F=<V4h[Me9$QD#Tf/g7c"$W#gTE_="b*U1+dk7C-p,_s$#_S*A"poH0g<s&kt$lekgu;"8,3;g3VRHaf+O[6stq.7)I+fpZR8oTkj+I#,Dk3MFE"Mm"Q"4?7unhlO`da8iEdJOM=EPs,=>;&[FeicJkND<NQa]:kajROBJ*LQ;8:c5)$l!AAFO&^KIc,o(5SnR6V)[>fS'A1kTsG(l?+4T&u=0^rBq.&I(m*=$_LZ__O)!s!A(F/=9@a1qC!L+Y"ZCk[IdAai=0%24AM(V#(1ccU*Q;pPu@D!O2/h;Uhn6!:)M$-H&-:<ZG&NsI5aMXqCJT92\5l@CI:Tl5=UYnuP>5(dbScF',d6`W=rf7Bmkls8A:]N8Ln)VF)ee0,ZNAEtN&pN-_6*e&[D@Q7t5/?2?EmPZmh)-`t\\4.t"#jG4nK-b&tjdNb6FEOfYS7aGYkm0sW=#=-a<;\D&fg.78+c9jQ""BZ"!E[3RlHM[`^\8h5\O'p~>endstream
2088endobj2088endobj
2089% 'R160': class PDFStream 2089% 'R160': class PDFStream
2090160 0 obj2090160 0 obj
2091% page stream2091% page stream
2092<< /Filter [ /ASCII85Decode2092<< /Filter [ /ASCII85Decode
2093 /FlateDecode ]2093 /FlateDecode ]
2094 /Length 1611 >>2094 /Length 1810 >>
2095stream2095stream
2096Gau0DlYkcP&H@d/s"If[P)?buJ2(bZ;GrZVgEW%38>f!LBX%fp`Xcs29eNI:^NXi1KNECI+Tb>"4#?c'h`TI"f_"?ocS,C0m(fgV%QH(_#2n"4)K`^/<Ms*u?7n6:fgYsaf=0P.):4gml).a:K1mOa.?&/4@-*Pg7)cB8,)*@G:&qHO[!_'_A>B6W[LlVm2GjMR3e\i;necr>C6T#9.(LV"TLK1oPHeSSB.9bfEet@6U`V>dh6uV<`7)b&-d_Z*3kp2o=)=olqe`]I6kO-JYnXp7ClI@d#r3S4;/2X7BFE2QYpeo1WcTEUI]it_Os?)o;=#qbDJ'P'n;nB"VCK\eru(gU#u@86LJOjmOhlSJ3*TQ[H]HbMf>0Daa6N!P7DCKp;M?gM;I&m([dY&$_A1j>m,Jj[W%IWJ4o1gR#l5IE#oT')(e#8t\[mq"nj[jr(oSfmO$"GcLt5V/(O/\\,J_0,>Tbt7En'Dl(;Cc#i<Uc(E7U)T$8TiF"Yr-W7J&OBPc.dP\Z3F!=fOsRl2d;t,=^OeX^uc;3mG^GZL4a7C]6[+0HV36KI@P03*od<=B?%Y)oFHL?Ah>4k[-H'lTA3N\q+7PBWZg(S4PC8JWqGdk;TMSAH49@#g4A@8YjBU-g/6&DYeg@+_NMqajN\)#&oo;oF.>q@QG1P\bscW3]i@%4#ELFd&F'E\\=ZX&Is=hWEYK%%h,XQpZ-.k'=F]Uq1h#iq/\2i$49opAi7%A_X'3[1/])iSk]iAWc3d2gnn%PJq[sOH\#Z1muEOPmfK>Vq"P<AIQr2_Wa)?!.uXiJ!CG:.6\K8@"QDhnH!/hg<o#pO($rkm,.ApL?K6"imR0J[,B<f59;b/YkL=R]HfDVlo629!MN4ng*-U@]QL9E9L4R,p[:DrG[0M<pETP;!/h5!+Fqm%uSi]q;'j=htoU=Xq>i$R'U3l<`R+DTRkO20a(;Kr_]]$in@erYK"G(7/d[>j8!4NJT^@qYNH4J[=[A#fMWs.rpX#GQ@g>YT+,!?)@?IE*F`m"$<TPb^mo^oC9?;C)TC\JMk4bRW1CY(bI2Tnah0bI@?*TX<D^G_$VE4CII'Reh!4A>Q,@<#%0,_=EomIW4_Eo#;5(5I0?,U%XXh6cL6UmjE0h%Q7:Ql'^bhQMD/TeMJ?%a8=m+/@W&oD[3hKPmV'#7(X):=UmA'CFFqJ%R"$KY(+WT!NZ:0L_[$[1aGPLgg!oA@e%j#08@>'<4A&IA@M*!4sW5h6;qWB6OD4i'Q^Mcp:oVRR`=>#B@_m[6Ifa`Y#!4DJY8ppAL4.K4H?0!],Ner'Q#Am#AdpX!-Vd#jlufZ09Q.B-f]:VHH3WH0P.niSh`q*)AeM$P=K/=amWOCB5ZS"_nt[g+P//?r5GWX-$TtBs/CW$BUQ-,$JG>Wp#Y[;5jB]P%a`(_;>#o\ukE:KEt(AT;uXGSC(ek60m)"7IG!E7B<i)MsY=:&$e<:D"AdmSNXtrLh">V7^H5C#">k=LLWB7Ipmc8\G[*/E.BchKM.)mL"/&iAi9Ou^T9d>*AQka1%4FLjd:a_Cq-8d/M'[r14d%&=`2,jRf4spq^#H!*BegXT@7Sqat7<Q#?E_ljjO1W9JcP~>endstream2096Gau0DCN%rc'`B'qs5ADEQ4Ap%amX$dO=oqIY"c7R=>:qK5tTZ`(VN:9:;(#L6csRgf6-F'9oqcJann'ln=E8XjPr=@^Z1jJ`JAtj'i5IiBL5#*ld4iI]c<T7r,[/s/CsM"eF*0>3#E.0kOdiI)o\"=jh_j0DM/Y#-b`fbdaJjH>j_t(eFC.WO%)."oP%]]%(q.6E@.uMb`mrKa/h-e,#(MKFF.V1cLc$XY\m;^k*\o@L:!>i,/l&MMs;1>rhe'RFJ_&NMZg5hM7qYV<)0BF9ne"M8K1[MVH0c]U(LYlZB2W<Uc&`!N5F"b:8q]2Z8lWe=.,RLeg(]Rn/pgu(h$rXO=1aA21*OFcGo1eYUYa\]LCEfQL)c*QPpI#MA$U@)bFLAMV.?nRF4c>2="6Z&uI+?)X/)Ae7GaRM#qW=U[oYCr4iiaP[pD=YT5P<XmL%C41!KoJkW+@ZA<(',9t^]KjujG=hrT4ebR@F/I+0`(TNp[R,MYF*Q94\lce=<Hk]M52+SODU'DWh1_pFPK%^cdfc/unZmZdfr[)N4U(k^1@P25"?Gp!;==Ui1><sc)D-qP&H7qEX7[8*W?2;)qCY"0@[U!Irr-7I3D0U(/"4(=k,(*[_'Mk:;QK)@a*$&[n[&nFIk7K6*IlTgoe>>56V/8AGd!ER[ek@K+CK:aQ/9>.8PUu7dSq1'2W2c/?`>(d!,0I>"jElLgF-fH"k\a?[n`Zb,C<?^.&t(2,n%kta7EgdO[\dM"Pap"*9K(,A3TXgMB./"a2\k9sJGV$;'/c:]$W_lf2Q9C2;'P4:hs5li`SE1O62#L*H%klS@;X#!,<"q@)imFNN5mM4kW0WC(K'HL_n?Msn&bdr04#3,@FC9sIV3a'\ru;@Z_R"XI_OI[)*R$Yj:h,jlf%@hMA4B?'PHV[gJKL\hQY."Tf#0R6Nm&Nb?,BF4;BY3ehsBJB0pMadbRSb(;R`@Za`Bkg034`p>4`<#Ru='H.=#r'm_n^mp?"!.c[M'T4M"1B<SBTA8I*llL3T/fj"h?/GspOVDE?jIt?WeWDS"DC1SD]cg,=mD7K!(Q2GG+=Jq/o0e4JF7sC\56Z3IdmQf[NS6j`QOM;s+#-A?.O.aJ'Jl!V`*m_$n2N<jbH/ine"p`NEJs388Fsd0mi`HPg;PL\M(IT?;:?M2<@P3rSX]#/gKikdq?KYFqoZ7H8(!>sA:tk+HSe-q1/JKk-3*tq*B,CGt#][)/%AMZ_7BnGr8`JN/DHV,\agI(Z;k2;S0?)2LNM?t`NQqIl0Gk4i*$][A)jDD]-QGGbSdlj]Qo(n%]+>ST!brIT;fINnLq.7Nqnq^nNZYVL`<DMg&=$R@4EV`7`ASro?jECeU_93,KDgpSHH5XO&0Ml[3"QQn>">pk;)jjY.'=]7Ce)4hi<-7<45iM!IdX[Y<:f^SR;VbS)>'!Qo&3\.l?OL]IX!u)+%9uT*"jkB.97Zi>Uosh?!FnEcoL"oJ1VW1^HnJu_0-8:3XiBg+$O8>h>s(/`LUB_Fp\4Ug-%QY=h"D?qR4;c:*0`#eS.6Zmp6!*LQMIP_nihHc2%TR9]X'jK3jH5K4$eKLYqo7oGN,>C;/V%F.(5Q:@t4OQkQ<][C+a3m[IuNnnd;C2o+0(grI][;bZoi58[Qfom9IB.Mp5(M&U:*0Znh;d0>!dZ]B)$aiBjBIRsFrYTZ-aSUKE'"6Wl#dH/VgqS3ca@>ZuXI;O0Um!-ES\$p'=3?+BB]M(e<=K4c:LMQ^sOeVBY&>,K(@G;1ecI1^[N';.S$3u.6lN,=La*G5#(]@+=Pr,&'r!2;Zldl~>endstream
2097endobj2097endobj
2098% 'R161': class PDFStream 2098% 'R161': class PDFStream
2099161 0 obj2099161 0 obj
2100% page stream2100% page stream
2101<< /Filter [ /ASCII85Decode2101<< /Filter [ /ASCII85Decode
2102 /FlateDecode ]2102 /FlateDecode ]
2103 /Length 1637 >>2103 /Length 1522 >>
2104stream2104stream
2105Gaua@?#S^l'Sc(=p^cPb&uiZkCh&s";JC>(dT/r*DTG7GH82i5if3>6a!MD#qVQX3C]]:.2AWYf8q;k5?66lE@g2uqrXebWNr_F=Tg'kh%%,=k=IKEB/,48@DZ+7X828\8_6Ih$E/-&Pdr,+@&T#`]9XBZ]'.R\-V5p;!d;IorS*N`eL7/S#(mf3WPq0A5.i7FI4W9=Z!J"MF(SI?2lm\_i)*B_K(sk,c1hIOXr=7;Ko>,IS*;n@f.JNQ=`?s!6@hn;PoguiLID%$D!]Gg]P.TIO-Y:\QG4D82"0j_q!O[oC=3q)n<[*(p8HDO/bs[pM+ABT6EQf*+].NZ'JEuP#B[jf30:/RMbrm#?cR_Aml[#@Cf?s6jJ<\Rl_F9j.RSiSjY6naI@iQQpQ,LQ3MUCNK8u`3@EZ<]s]jM7N`^Cdn%)P$#9BM$$&7\Ql$<)aWS9iS:S?$1gM%tYGLWhB$MjHu*djUK"la)N?:LKW(E*br]Cdcl^kLVi<*bqu+_p]PX<Dl*E.6`ORJO(h%8LoNe`YM6uiV#rCY"Z=Mi3eC<1h'rP<BWYNGBeKZI@h(#@R>_K6S.H'Qt6djJ;hAQNO.at!D?YuLS+ZhX[S27CNQZ<,GL?$>i/#'_=2\:=52rS2P`j%EZs#lGX'e)n^6s4:=nQ8lAbXo\i_C.4oYP\nhG8q#N=bb7*(QEKGr=t2i>r$bj,>RI'$X()4[C!:f;599;r4kf2(9RCk0W>C!1'V`EKMYq6N[YQ9.&n[SGm/;>=2nW!b%D4-mYh:mOIDRBV+2?p`"n`FU79FcEVJ.+^1eck0>G&N!Y'!5\Mo<oPfmPP,(8o$3*S8n@bOnjrAnMo%="!9F'_ll9?3IuO'G_hK\(kmH0sSP(IA7[u7OXRK/jn?[6.Pcg0n%am'$)0ckIQbAZ#7R+uh"4@?.eFc^*VX'hi?7D'IdZ2)B\<r;%b2SKJX*3]LB2l$Bd%K3sK4:`Qlk[RS$A[0)Dlq$ABB_WkEW<@mIA9*;=pN$k9;HHMCh'peMVb"TQD>YgqeV[sgYH)*Re'6YJ("_K3bs,]E=f'##\9uIZop1[s/HNd,-.6j"\mGq[O&qt5nU8PGIt?MWh!*(;T!3FESpNDXHRT/\A*o@:Th:)Jn>`.]0WR$jH8u3]N=b=ZdJ:#WSYJ,ThWm-HVSlke61(_f!Q"gN3f$)jnjK(MiV>rKkZ&hcnJ6(SnPK?E[)3M^81KpqcmIWM<etHrcj.6PX:0NQg]uTX<mOUA4o?a0!^:Z=ql;:175Dd([GW:C;p2).'DdP4BNWZX@"FsEPh]AhCJVWq2]a+:8&%?lB,M4\Z<;_"Dc]<&OkJR#<'CZG.R*.!TEQhQ*IO!%W:@HKVmui(I8l4F0b[@DUVLJ=ind)O,pM$E$FEN$c3CO6gNZ'*jAo"jb*iIl</<5m*b*8oR@0"Dg5/_QA;X8]OUuf#[L(Ar^[p'#]in-d<O5>jLFrTq:X"Bp)'[t"[g0VI@GG$R9T,c)K2?Khh7@^FS/@aZ2#GO8!RS71G$gs:`SngA<sg$*djK*JT(,3$FT84UReG;_pX;5^tt\n0@N4uns7dTUl2oXP'lBNYWdemJ^Ne^R>U__\D:B4E/A2]l8V>:1;OiJX8(sI6bE"Ef$C&`~>endstream2105Gau`T?#S^l'R`L25MVStU]Q>A\+<F1>8jJ@fVTV]+Y%mWm")\:#<O!8U=K8;hAI7@J_7uZ.Zko=m`[gX553ni-8<G(UAk$E^lL:]]dH'eQn<lVRL-;*pj(HZIHgJs&aQsb=I(jg4Vu`BHf$u,[S1s?Kj__Ajg<naX&-OqpMe%+3l;0HKis?P*,oHj=+5UK!G>lZP76RU5=uS)b\nVuR=Kg*+^IF)-K=+kAq.Y`HNiR+'0PDZdkAZrhSZUYi;gRn[KQ;86_eH]aB5ehJtRM1`;Jc#)Mr?Gk4P+0&!@WYeDJ1q&QFEt!h%tTZC9ZM_]WI6^,dF\OCr#h\%aMmns8@\e1kEZQKE@j'a:YK=DX=/0&Cnle0`YB68$Hk<[sF&[??F1B_GSDo(<QJY7.:(8;LZXa\XN2?5Or%/ta5^_8"=Bh^&'GkQfHX#Zm^M/Yi4t5_[8Zo5)3AD4gqEmm+3AmN?%dP2tgBaTrV*,NrUQg"-dd#K;E(NS.1mo\2[GdpMWXq.hShrrn8O"ljr<*&!\Dn.4&jjsh^APH-[@2]4S(08ApKk&87GjaoGeo4T"h0&XBW/@18W<h"JcC0&cKiEa3oF1idjH%U`'!C)R+?MOFti4FX+oQE"#I=A>RVmi$gN@F]147S&D)_sic%&Oe6RA7&Mcgb#QR-D#G>.'<Cf`S#8B8"cn/CPcEAECMR%g.Q_+,:/TE!b3dq;F*I>#ZJq)+4a*I2G;rX6Pps_f3$q*%PaVka(E7jO`F\Z"mN<#Ki6:kgHGGRel]2QQ=a73E5_N1/%gT@ADB/O[6"0ktVIeMc-0:ls=PZO<L?*hFQO:./h:J%g.QnTXJ;V?IAgAM?B6^2Vi=S@g3?-!TmLB)Qgqki2j]',&4ZGS'/llN@p1hM/:7hkg_q7[f_DhE-tKZUEL_FED:e0_?U6S<4\C/*CAL=KMZ.sr(?M84^/>G$"'aQC:G9D"U4QD\s.r&kscKW^GL]l0,r'CMAr/%X!_TIFjR6(\OdM7_fc:*%'(C=?k#uEB3qoQqe:Wk8JK9X,Kb"#coP.dE*Ac(C.[A@=mZO3q2s4U@C80S^?5Y`jj&_F8EBOqq8i-LMo&/$!-8*A3f!\+O)a#.cu:;:?(ii0=B[:1h<a-s=m2h^q<>J=9i]:s#C*!8)([2uQek?'d5tK\5__P:n[KJK+W\WSA'uJ?kc9^[in;p'rg7'GTsr=G)M?e]mP^cu^a9PL@:)N[h86YPduek=5NHe`ZT>kO_Q>_iio@aNGC5X_>>'k1@X_@b+R8i?/[Fs>QFH#S&9ka-6M&#/?Z@%gl3IH#Z]<0u#5G5[YUF+KdYFK0>0X=*O;:3n$,,HRDQ$<.Fd.2ei&^T3r,gFgU\7"k[=!dP-LXr'@ocCW%3T0RFC!ce><b[<khp^)_\LCL@r%WUnN[o[iUI`Z,Yns[]C4_0#HLSTe3)KkO8%RIO,,Eq-sT$G=feV&8lnNP,^JOH+iRi_D:9N5;t4,r:Ihs;ls@+P+*!Ytb9QE\VX`fCU#5_XieKH5~>endstream
2106endobj2106endobj
2107% 'R162': class PDFStream 2107% 'R162': class PDFStream
2108162 0 obj2108162 0 obj
2109% page stream2109% page stream
2110<< /Filter [ /ASCII85Decode2110<< /Filter [ /ASCII85Decode
2111 /FlateDecode ]2111 /FlateDecode ]
2112 /Length 1622 >>2112 /Length 1650 >>
2113stream2113stream
2114Gb!SmgMZ%0&:G(NJ!cQH:1:YuXIIu,+\cFIZ+7BV>4fceZp`Yb,Z5p;47:^E87)ug)egl`5dq&-985DGSiJnh6TNN4J&d!b3P]Pfr%rB.E?Up*j)mJ?DrE$,4o+F9`7[6l7M,EFV]5:R*-6Gs_ar4TO?(^WVB[;,kt0Jj.VGY,BQ-&YM4bMJSDt#$6tV%lgttHaL*n1A$4&%3)4uJAk),?"*9'1+rmA=Hq^X=i?7.e`M_;MJa'H=9n%4_1.8ZVW<M?T%?P#)4-2+saFe],Dr^oW@La]YF12VYGo&nbcHbjFH=L:9/p$)p_D6E=qb,25ac'9]cQ^=3M9f0iD$=a8o51B*2Y<+rJ\IuEFh`k`J/rLo`(qpH&9Q8>[oUJ5tOtrq?_h=J_c7#E>$V@D4o>C;0la98mRMQk<0Q*``]85dh_=`,p%.4,i,%:S3_[(6d'rC0q>`gSTTV?--PEKMA\2?J=<;Y3ghCG\&F?8K,1`(0iDD>I^H?;=F?O#-V)h<a\m0-i+/kH[ZBHt.q(ee(%iJa/Ya\#JS;Nd:OHu>W@qZS7qV;tk5BaT[H0'^%p`cJ#-))H=lRmTX]1kS3c"m$/JU1'Xf1n\;#6mrd]1:M!Q-PCoAlI!gIp^3<te_(%C3/*VGd4r3G)jD'n<froT(EaJmg)8HX1W"AUQp+Hi<s2,6D8Q):fe(:(?4iaP2a\71Qe&=8Wm%iMVRGr842JO+qgi*!-6$D)E/F>!<b-'H?f$8[Cd3I9?Jf\>of%Qj$L8#sS>D=[Q7`\TimF*;0YG*0^V%0EC&;F$Y!B8,Xm2=V:_S=3EXnGkm`s4hUQ;DHOeS]f]BDDFk^B8-2N4TYR8Wg9C4i4r0Z@-b\mX[0$b$o.+R$>UK6Q,1@[HP?/HXMBh"\P9%9,1QW7]AZ;bWhU\>@G_*=BL<n?)RG$3\ms`\^$reB!sg)`8GT%2R*`dHa*+95^Lm=cGt(i]:s?e\]]CO'+S%,t5$+*mW#&#]`T@VFIOkIP2*?-f[9>5B*+QPD\J&7'],i3Te*9)dr.R<8d3F6a&d%>6tB]\c.?F44/OD)112rOd334+1Bn5(!.@BgaG4\4>qo1%3'HdDa7ar&-Kt:0UWW'.eC)?ZZTCF8*uabG-"7a<gr=e"2r\iSEL81R9l5ukh:^42D"#"T>R,o=4[t_^%Ar^9'93/Pm?+2Wf]RoQ=Q0+)Pim8>mg!]n#KPr92QfQbiV^f!9C:!7K-\1@Z,E,&N=N!("H+r(;:S4'#K*sfA4THVauLrOCPQA$7lQ>Ki>(RN"L_.Rmq&FmjbUs?&+tda`qrBkk#f>e6;"3Ot=X*7C-\KBq;1g-H0lma;`b<)C3m;(m^=!CDbbj(5-7KYZ/q-f,lD!T="a`p^L-g45eS'FQQT6CHlUi("cDKn(ns2gnPo1227j[+T'_fL"[d6/Qlh&dC6)6%$!`6p$B<^mIo[a)]ca7>^aV/oC%6je=seS<)i(:I1+E>8D(BOme.[:M]"ht_L?u/=e)G`M&&GC>;CcQd1BOG.@'%kkG@DZUHR5poE.>1[iql5N(c8MRt)t9"\BcWCsNAocb)h&3V^Zu2mel/^Lcn[D_;iQo,o`B1cDbK7VEArmpD!-e!#7]reP^p~>endstream2114Gb!Sm?#SIU'R^LRs);>".YFEeZG*t'%quYd`mVe@SN"7/&oFn986)CSGe\]oPb#b;,$0L#ZuZ4O;U!>%F"T*VBcAW$Zh8[8"+6KPqlpU="1&0`Y3Egi$8,u37ph=<m*0a,&-C06X`+t`S)^8NVBoN(1+,uJA4fI7Ht;KFQHS;5%(L.5oYCrEQ=CF+KW9Z$h-Y_1;H]>+&gAcd$6itS8ND<+E1%4*nN&]3=Vhr=J_:j,rMgJ.r;r4!R8-g[efuM[(DG^WTaO[n,,:mc,!,P%]mn'Yh;1_#r<'r5HpJEc!1YZuA1J!;P1?qVs!K?um!US6buTr*aF=9eoc#B8$A]_$mba'me6h1f_H)I";9FjAc&Bol,$@_`Qg6timd^8.fsEGROjl&&H3kn)9trX#PZDcrj1F'ef\g4jhpM)sDYGUCqn<qk7:M%U.2Nk,5U,2KVd'i<""IG/^5Ph@@<bQA=k-9'aGX6MS&hNY>#%Xhh2=$+J@OdgDbIZN'uJbLdkKuL_qonka6>e8^5&VQWIqZ(Tae$N.7l_hX21++;eN>R5=nVR"fH\r["@^;h`lhOaQ];dXV<Ze9eXMKTpZSc0/T!HFZu^*b*NeU:?1(mBja-dhPmiB3\LcN:QO,,]548HZ@N(O<*,=Fm3m\oe-ZR'S2kHAWMDU'Hpt'VM"Tq=$UZR9]<@ORXL#.5/OlAlGibnf:tHdX_A;I^c+,72QY2frbUA@X/\r-0Hn!NCf@haIF$Okp?,!Y>a;E(o1grZWO=>UJ%PXeQekPGWU_TF>>&P_QKns@u0/CHW)2\8?FR:Q\M^rJ%if8"2+rADr9Tcf,;-,*[3QX#j'gkoef.9Q=,<BPJ40IVXQ)rGF1#X3g0$8<I0TPH((;KmG\AR5)&lDp+[f7X+M.9^[<HsW[=Kmb$4/-WUCZYT>P,sr<\Yf)Vn$"O`)qo!-aOR'NO$fG6%"5>ePHna,)-tVuf6+g%S7,>)bS)N:=>>m]//<;tl=uHE&tcMq:A%3R)Xb`$g`^TfRfH;10`"mfYcOe3(!1/G!3r8pm\.0n'#k0ljLYcj'o=D?D*n2FiYH&rc\Y'=g,+cq?L#$HXm/S\mAW5g%M,hjhjN1WquSn3,k`(1G`?4PXKCUUqk#.g]B$ODp:1nt7mA/h<[g^KSLuk1Zg$jn4Lr&955TS]V<sJlnHpc>O03eD.dYXAEdQXpm!.F/-m$pN;<n+V>htX13NJBOWs56F@$9/J4<3c1IY8_pK,(NG*CNLAB(SAYL/dX==R\e.D?:)E]-WXl=!muM^/VA:;K9J1U=.6K`OHqOHdG+4c:FJ*Z]g0XF:>98c,7@h@=(//+"7P;>R$E_fe\$!lCNt5&)Rl1Sr[B]\7C;`E*WF#rA<0C!=o#:B^cLNZE5rk-(!LDI+S?0.\lD+4]fXls1,7kgEO1h$N#@+_>^DNl&C/MpNrM0+Oj#@R-K'lQJ"E+KR2,&&]F!?@.3;N.6>_n@XqQoa,*@FT#ntbo?@llIEM&+kc+T$4T?^"rEI)LCeOe/i,!llG_RG^+;g*,=cI*R:\k(eMTk$q3^M)uTV\sVcU0p4XnHWWht)&%ll8>Z<R2$chk?6_*eZI8gJ+^g4D/=gJW@*_QGMaT^)V82mAj.m=8+JhLu>l%$lY.erWT#lLt;~>endstream
2115endobj2115endobj
2116% 'R163': class PDFStream 2116% 'R163': class PDFStream
2117163 0 obj2117163 0 obj
2118% page stream2118% page stream
2119<< /Filter [ /ASCII85Decode2119<< /Filter [ /ASCII85Decode
2120 /FlateDecode ]2120 /FlateDecode ]
2121 /Length 2297 >>2121 /Length 2152 >>
2122stream2122stream
2123Gb!#]D,]1[')kW@s.MAO=*CaZ#0F&f`<VQfKN^pZi)FUgI$GUC@s\t_UWeZ>b-0^#7t-)Dprl(\-3Z-!;>8Pco^pTQ!nt]P^jhDCU)-2NHQ>oodVqN=]@j(?)4_1[G<YK`"S9=?54pt-k'm?'O*>bkr\6*IU.m,-POUmTZ+I@2\!lRL%LauHCNZW0VdToC4mKA+56$""ohdm$'^M\gA`eYE3[<sLb,1rscY<.Z%KGZIr;$k]p3ngQ(<6=d7HZQ9_Ojq*.$l8\ecNeujm8p`AMP,d5Q!7!Yg[Fg%1!:6S))+4`5l1#=Y\<+ibFRhQH#k*T"[73V_bl?V!^OHg&M)9eEmLq-gsNfN1;B`Ufjpta+%Vgg)s51WO.eWDKktWIKFCJ_=i/eOW,h,EKU`rpW>*Z\e[lB3GhsUm?@AQW!S+DZhId@?7*Nm\o]-SKo&U2aHS\pH)2_a8!n<!.JpgGP;qbj2CY2Ln-LR`A`RaBfp!kT?LR>ZK0/K"$HD6jJ[a93csm<-YPV-up:()lFVJ"r>U%247#d[go!Qc5RZukRm_'+n0@Wo@(Q#d,iu992?F\.?chHTj2e8KZ%L)%P%67-,'1r""d\(\<-:/LqOqd._rejR1C^H-9?m3ok&RNkAD:3-QMDu314?Ol:VO!5XR-TqcZr&t>SbrODYu6s&2DI6uI!0i.S:7?o9N&"H<?kqLr]j"W'(Z3V>Bj3e4tb*0$a_oQ26(GAdmO9'$ZhVK/-#+%`JXntCQs]siFD*Pc4^B1.\d@*_S2/80U[m#i`>#3+:Y+ojGH'^[R&*\`02\_4B(rmRG@K8N9[f$=l*g*f,D$RTPfB3I;R?57mV[/hQ;Qq:,s@X$sO2+ZrR^6Mjj:qV3;7f#NTCd,XCH_,WDI)lbHmELPJfJ_Dmh"ndDO1nbeS&`Z1R7.Vr<M5iD.U;6M.G<@>eY(.\br;aV57l(FiO_9C[[F-gT2Kp?Y1Aho;*MZ*r/#M7aU%m%Bo/5fK!\i4p!LehiL48A&il&=?`E;S)Vpsm"tp)^JeXLb,g_=^;I2\EBZ2gB$]*C73Ke36&:Xb6Tt2Mt1`PIN%6>e&H6$<mDZp,W!Q'Qi%Z(k5-$$u2e;q6iC^c,0/)oET-^n))%!)-=1$D.H8:\`M[q>W>?\5a*D`2';$mB%8kl=q":*W.Kcs>[,=8*'8S$[OagH>XQ.aWhTdTbZ$EoWQ_.M3,QOj,c4&l1WpQ17BmRFNMS:CfI\nO'Wba^BGO+F2"+t4)oS$ZT62IP@j\%)\RWL,0p]hG=>uGCZo)4,F/,p9:h*I&<-McO!cJdiPs4&sQKCD(as;.6S[*9mK\dOpYK3=L7,3E,;8?74(^"GC8QL85b2Le#+^GS=08:PQ9@KXsf6iKcY+,Ke^/#<ugo=&BpI/1%&7Uc;]Wc2aj8^dTmFZ4*bP11P&&XTh91Vl+fUn`d*PaP"9iL0a[\ebGc=t]eZd7sG`(ZJ#(-f8%ip?Fl9O/%$r$>a-npVH+e]*H5eZ`uVil-]1J,f<CiYC;f(LOrR?";O;Cs3-3EUjJYU5q5i2"HOU#8a<,L8XLs?p2OFF$CVc-Q%J8P?R%gi4%\"p[?[hZC/jVkpl1p$dH`Z[H&=j<mI0e]_M'bqt&!<IY6T/lQFU]gFB*FOI023/nh#DIik9nc;'Z85$T/D3B=/lhR\rI;Z;O(m\WL%-b4YLZ_$>qb>g*,6h]Kk?Q!d5YK@jF.S6[pV/a:nXQ^Mj'Y3Zf&Q#L-:.]KAS1@Nf5X+#&<k58JPl1"o1ZK!=G;RdJ]n5<,`Hc\r_57hd5%J&Kr":&7A5_40rNLiK2p1,>5mV["a@,hQOkJ7/NdBY2C4_5"NK6k0n;rLsa8O<;/b(9:1bXdBr63XgW3_U-9Oq@?mh='sC9:nA2=XIEa!M-Cn1aD$HR-;m-Lo,9s#gSCaommc(!%1).'D/J#m#o0f4EMYQ=Jsqh&F8X+NShZ\aC]C1^;(ppIp_&eM(IqK4]aKd`ABBd50YWB`\Ucb@bplP([).X%4KIcj3MW,AVYcaYQUs3h'<O.4NkRBb8u"25*na?A03OJj=)`>s\%k>%3f?6#Q#o?&YT9LnLq$-_<]T23@>Z#G'%QX7?``]:(Z>pTq(>F@A`qJmX)EW"pm.,H"8H0$\erc1b>qDe=gt)WW+IDDbu&rSm3oo?`)Lptn2eMr-Ut*H*U,hSDKX;K9eN$_Lm@@SFgp;nA&(^g7rln%@HdgWb@gVgI1<D)k!<F&LVLA<l>'0i+b^U,DCb9CoQE/oUOmqa%RCp&>ih]aX\'g7:<Fe*bMRCm#2D~>endstream2123Gb!#]gJZcs&:LI6J*;=5ZIs7<9>8KOPm7R+W,V9YW,/crLTr_F-V,.11VtPI^YL,-(_^l4ROXI[[R[+\dqAM,44(dXNr=GE!UTXOrm1\d"b-YMX53pX":k@SNLS0%B=?FXK%Fnl)r9m6hQsc_HVa0o<"Up@#<es:k!m7+<TD=5'^1cBl<Wm(<7$@Pam[[P'<$?gRFZ<g%ono4+lgI::>$cN4'UWm#QG;Bi3,Wf>drQm'nauSIq0;1n/fI!=#'e4&K4%GR7n@f6>!MKeY%n$)6c(#@:1S%&2Z>-dWQ,5":ikol$<B#?<+d*a!6`QJKt7n)B+`k*/o]`Y#uo=JH6X0(m#aX1qOLm37g#&EW(/4)IC+h[c8LC!?XV#fX,#94<4%'Sj/+XG&qeMBQcuJ$O>(_`Y,6hV@ejuZc$UROH0=ko.[gph-E)O;oOoiL)R:#-GhD[0U(2Q,;-tLZ]q(WZeg!1r3X&98'I-p]egQ@9Ek1<]7c&RF*1R'W*M=scLr.i=Q(`s$"UgZB3FX<NRmCoqQsJfg4@KcW6m\>&H^p8k#ihome5rF\WdO8O6!M+O1*YDh(dM'+78dq/#:RGX%6o`./&>A^IUo]"nhO'#\c2'+e^6?-VTe6;W+R+]]DbBJ046035\Y(PU*1*(:%\ed9'mZ/P&ce/@=B9?qCjBa!o"`;FI[pN13kW]t,_tT:;/0]L&(+hJ5%YHY$IHJtuTdVG#aBeaBLplb8aTQF"T$qc#<,(INLY.U,5sgNcXP]l$^fk7oak/n?]o/G#(f[eCPXE3n$,LN0Y.G`u)e*[u>`Lnd\&1`!m"MMY@`'='ne'SC]b4-Zu^UC=6@pP82'L2%ud1uo#u*[,O4SU2HhH.jW,mLo]RWDs$iiZuL[lj&;PAgTnK%U2:1e@tiPVZf+KNp^j0PXH,?,"#XkitsT3L^j1*%N%+Tn=dX&*Ta0kX%>eJ%Q6PAWSqB`A5mq7ZG-S3^rL/iP4,CN;e(.sJ5]h&32'O*/n4`\MLQ&A4qlJMk!L3u;0jB\6fhX(`=@on!^m29Q5)GQ"fONt-lPV%**XRnEKdDi#C1@5EJB("`=\IOVaqdM9@(O,fA+ZU4/I""s63T8f0#Np'i\qpW'R<cH$ug2K1h5W0CQ`rTo@&6]]_7hfFQbEjCVMLInM(J=:<4(AkBcf%kO6V9[<f.\TiAKShakF*:Q%S('h0A3ZX<-p8Dq7W;mC*nJJC"6X7`/N'7tI!SsZ*9a&"Zi2VB<Ag3)D=Q7u9Gu0,"[`eT?rZ!4%[lA+eNWZJk`[$fsW$e,P51#-$^4Y<lV)*-H"BS?(ld+^2b?JKRR!1tjLuFDo>RcOTUde!Ml"IZ/QeGN6_su=1-k[PTA"Zd7AgU/"BXhthlup%Pl2Q5J1PIhh7MIF-XCe&pot8SUC=[8"P^sLjB.$UI#`]QmSbXBc&CI8b;&\2JO4\]Y`?<*&iR;;U*#Ph+;KL"@\C7m!AK&^no't"S'f4ci,)-aJo9_%_B+6gYZ*@c[7$C$A1"EQH#2H(4gs'?p&lcaoU+$SN'Q85LnO&HFT/IQfNsXtR`U*_e(B^gVJi+2_EF#jF4&PPadqO>X'QZ@bH$WNnc/mO5hb*EG35ce\C)Kn)@Ng+sS6t%6%ogCtBIX>`)Q$+MZnMS6mN>S5lIpe^J+pgplBS+@<Qb(T;n4USB\7J7$ouo`k1KL(=YV,=7EY*ngLmNR6;,:@?n9gKo@)Q]IrKCa"XmuY:QA$NW#D(`,2s)DNDha,d3KB7T@S.>'3V-1oT?f"PMIGtFj$#R+[?4Rl6WB*)2)g(_0r/;]rQ)/^78Qsj#r%e`t,dtJ8uqBZNabVI)_)s`@LEm^S^\\`UT@GI.dlu'+?Sd:2r>2!(g1Q7N^lCooIDEk(qHj8.of\n2I>Bj0k66'[JA#[9Rt:a.r7TbKjNmE:.jNU=!d/N#3aqYt!V>g>LoXh:(6&6)if-Eqe&!:+l'&8:lZ])pCaJ7D.R6[^V\!o=<u<(2Q;UW7Zi`PsD#u_g(XGq8,q&h#<,W6n.h"%(H!<@kOoI(ZU#=YQpr8H=77C@0>0L*Q&%&Tps?8#7GabgfAj8e*]>_nW41G3>+6_7PC2H''G]r6V[c$[omo<.quF-_W:l*DASf1NdW0`[Id9>Nj&n7_resgg&M'b~>endstream
2124endobj2124endobj
2125% 'R164': class PDFStream 2125% 'R164': class PDFStream
2126164 0 obj2126164 0 obj
2127% page stream2127% page stream
2128<< /Filter [ /ASCII85Decode2128<< /Filter [ /ASCII85Decode
2129 /FlateDecode ]2129 /FlateDecode ]
2130 /Length 2300 >>2130 /Length 2382 >>
2131stream2131stream
2132Gb!#]D/\/g')ipps']<nDOlK^>4QHVk_CF+H3VgMCTDf/=;M,m;)U@tW/st`UZd3B)9OU(S#n>Lmr$K18S.1TLX3VP3:W]&IsguJ8cd4)G^8P++$c3Dht3?K?9pe<5.Wm@o%.Y=?0JY!?G1^>`HR?'r\;h`;*&:>np&)04$K[VV0[T<KRj'QL=_,570>.*&q62HIg+Ai-SX`WK9dT1:\.]PC%XtpbjYin4mAM&p`"lN3Z:52`M?Z2Ju:Bo]3?bULK(/$9L5bS,3>5(<i?FceKUJY:VKOJBR.ie99;P45-60bX)"!j]n6$%YPn2'ddHrn)Rj'i]0W=l%N0M:fu5oqM]6,%eN?pe8iH::R!C`*g@10&"D@5cA[$WWR]<lZr!OEM0kiKa^W-Jdm0??0Zek+nq`?PtF1hW"dTgg#=UYTm(4LOU"cenO6")`:<>n8;21'n8fj(k2!LA5B*k^WZJl^)rE5o9-2KZ#"+fB"+YCTtuR'@KmN$2d`"#KKdLXF6s;"+WmRk7>Q@!>;;4Hb&1Tec71&QqIL>Au%R$d7cLAW4EiB]_b+;h^],Gr7N"GQ+X2239:m:8)9-ajK5k#K(gVr:32CT_">r*U.TKM!.=24:#p3Wj$bWTqm<ZJ8h$oYS<oaJ&VJC>bg2N;NcDbraf'H=7m@/N_'g-[;6<h04p0MgIT"_LhHf^`*-o,l=D(UC?WLL_GWor^*k-j,kk9l@YY?PKR]Q=X=Ae9Ea6cZ9p'eLs2^_bh5Xf-3HPpfl\qs?3pS0ZaJi(5:9.3rBWG%cRf69kX.37;:r*=#cSbJ4QOmQ$L<D)'r'oq1cRU3?]J':D4fL^NkQQ5"*l.CN5!clkL>S^i!!g8o-l_YO[$oqO?4$RUKD?QP_Z28$A'="b.V+8J25C]9K%g?,kTS+X4^!D>6rkTN]irVe>[2nPA`sOQKs<L+Ko*=(/E<`a,"iVJ?7n4W_cNIH/OV/-R)f-AfL!WB+p\W[#?`4PUJo<d+"W+O\6'Bh-rhOHcAlE/,0,12TMSdRcM0#la;i_r>`L3ZkE0-b+q--R"54QB<%<uMe,\$!3CnV>AIYmCdJfNS-mVZf$ASH?j'>]q87HU2kpr%1_6;jQ"1bC$g/TUjN!(Wd]\^sQR_k3bKd<1X9,`Fg[88pHRWL5P:=Ts*X@Nt:"6%Qm#li_9\&5]RlOa&P[IBn4p;^fb2X\K@c1Q&2J*kXHs2*N7P7Z%:>N!nRGgW-WqQF=H%;.@5:;Rh5B7oM/0F@V$&+IEcnBJTE_uX0T6[3hR\j)d>_]e"L&U96bhd'R*?ud@br9X=g9b&//\$o6?=G@?4LcV_EQH(A%,sUi[5?le54Lqj[r;##.4ahW`ZX4)6onbcRVGsHAjD%YXLR?,N%Y0Yc?e&ps?(AN=UIGQ%=(@gp(30;QaSI5m3PQsUrX.\2T:X;FoBDgnn*?s97(CaCm+2QLl<utF;EBOVF*0VqZuO.VY/!0FXF9s;:?bnRghK#9DuLZ3Yrb2:4X%l&`St<].:f>feW!Gg]b4b'I_]_c8HKk>/B]JCE4L!`+>mGlh;9Q3/c&m/$g'q>+0_r3C0k<'PsJJ4BqI/?e(,]2$cI_DES.K]<=3Q3=[GH?P\Sj&@Y74RA^!BeRA[#a`U?4mgMFLp"!8-9Y\A6`9'u=n3#*>`s1kN6D;SpP[(?"7h.X/+=j"K`KYTfkh0uHf<ho]0!&s316PeVK'di-dFu93FS_J,\6075jDqmXjYtLD;-ZB#_X7VMn0S9\@&4pJmkO%X_K4aknRGpiPi=Ug!iO=7FDo]?'^;pQuNTZBYJ_rV8b0WlJ.8&)/cQPgVmcf9a&ldkV%UBcWT*BbBq&G-SIe-l%oZ-6M?.$=KqoZjVA'o#Z.hdp9UV":68q=p\lPaVP2\RCrk&a(g68B!fTO9mpg,cMrrF's:Q4c!!1HX6K1:ENN)F(`'K2F'&CeHU;KJT'4Q.$<oeIm<Bfn+!J=VgNL+JHZkkSA^JW&YX'P%TN(@@<R`GdYLdfaS!O$^T'-qmnlCbjpj^pZ8!j67iY7FgI,LjkZ;^Ph>!!,E##,gVFZ*0^!W=L0>(/ZJaLq5O4&_Ua]SA+2CJ`5a*(SWnk]2RBUctLhQpbo$m'XM+&=7@E+7^@)3_?A4d_Q[S\7;Xk[46*3[9>:o!['2Z61L\mKqD^ot@WIfu6JIbZa/$(uoPF'$K1??PW*iJPn<Cc$Ys:H1C"H4]uJhJNNln$Lnc5K%f.;dbJccCu79IfPXsQMpBV'O!f?$T\c3rCk)hJZXGLn81)aG?.1hLj.]/2@[\srrYjT,?=~>endstream2132Gb!#]D,]1[')nK&r.cn)h8O1J@JS`niWBaU\;F[t/T,duS>+$OaIYcI-o3*,09uROh'9Z7$[BeiC/Y-<Uf$kBcZDD-/Nfui5L4c_$,EMN8*:q<<U_7&l>@X?$g@D)hgB_H``oQ^[@u,a\<V68NR-6]'miTuhS)8XlZHMQgc"p6>&6Ko%(>Ep$Rf_\)P..<_k`N0?mIF^73W/]#k6.#!-0[>)43F^mtATjiG\_9_<!cQ!;ukKs-!WZZi,1QX^6"JCM<_b.NV0H0Oo>eA;WMP[B`*PG_e3;&Hm0CkaU\0A42$2O27;*F<A>DKV@+=l`\:s4C+.K.Nt$BSfhsq#ap9&$Mg)0]F;]Y\BV]b;&HfL#T_%j$/p***/g%ga#oo\q/NIHMje7UiO8c8C79!X)o-fo7^3XfnW=FEKgPKXm%977X'll(iI9S78Pc\gqWRlBcr4^s@=3>g6B,5q/TPfPhF<bQO)&-";EU/c`,+_Y@d9uGn0Eo[be\Tf3j5]X-m^XmA%jIc)srDWSn"GEI$0&A4O1I2^b*KXCBHU6L;P0fgi/NdphEpT\`+l&$Usf#DR/'-nB7?"pku``SB=dD#$k[V1u8af)'qr]8n8,G>'q>^l"3Qn(*\dT/2ImB3*nqE3("qbeqB.f/=,NoMi`QF)hff5jp"3V9:5l\"a1MI"rRedfSl"t"u=;^g^nt.Vc.Aa_>coXcNJ</Moa+Ii!s>pc>60-Uq1Q^V]3sgE,X2/+lrcS!CGtu:adA%WKr?NA,=7lfb#@aM`L4t(<OT[Un!3&gaV*><qZ.&q-mOQ\@GZ12$G.tSWnRQ@-_*TfP%WuYFYPd`(%H:HF`s[KMY]E8l9n^.9!sEOD=[cMRe4'lCH4QcJpQ+;oY'aG=h_'_Gk;scQU,AHdt0.=`&Ahr@OCdF%dN)OpmTf9*[inPO6st(LU[N13PpMeYHCn22WF6AN!I<RfcYr(Z+af5qAg*3+5FVS,E/;%Rk)ZbUVJ6KcoCe6FPAtV,QD.>adYc5%cCTKhDmAQ3j?7jt<1G'[J!7N$^%oj0=urXXn!\COn"`c!eI&dK$(EEP4Q]Ihc!A,SHGBW1gqEoQeWb+JPq]^+<>idoc_:Q?`4gMr5pgP!Z:Y#7<Hc":0nl1rI%h'gH1.6`0A.JqB/%3VjI@01tiUr[j$s=GYS^iKOpuCT81l&^4[7[Rg1t<^VhoV-N5R6GN%A$Bq8s>F%1UXcVP/4YtS`C\SDFQS<QGB.iiEQp#W)WnXod\dlSW`g2^WeWj.qPUKEW-*/*Mb:.@7Is&!*E2O'R/o\OiiBL:Hd%F=Wjj"S?U\)RlN_#_e`G^rm1,qN0^h7upYiYikQ0ufm`qfeti-!GigA"`Q:$0-,@J\a4k%FGnIIp'd%Dse>HQu7DC>8#lN11eikT\.`:U1D&^fh@ZoI;T?EA:K58WApjKuVQ)#T`CoAgs''*(1D_(Bs+8G;^KDQ=A'JIUR'O_%S&,)G=DTo%7&("W_ht+jA`]P-@\QOg)R*0XM@2r2*4*dQErgD,cWZdQq,u<cl=`_.![(]Q=s'?Y%)p+Q:BBZ7@_eYpdV'5lIJV0p10]LWpeIp\!oj<nKrPnUf1JQLY5E`=9:6]h@-@%KRf+MITu[B4[OKOj4>#fOHOAoXAQY<JVA.H-gh+lA0/?8!3Iqk"gBo5PF$ai)B*mLOZ$6T(W$<kQFXM4m7C**/o44?!?e<I(C6nE8'%`*f^G;^%&W,*r;4B!lMk,5?qL[?[dO1h]'.W(G5n6Y'OSnn8dI)e`H\bB^?66BQnu]8%A-Tr#GRnqj(#R:+st*hqHf;<Rg<kd8[k_7.$tD(Zc;pl'utJcW\Tj&SAnKfA,sk\1XOd>K\@h;g'c=9ciBF>@IX&g$H4Hk47lg2B-4"0XDbh/7noaa*HCf!R(7@Omj/(cTCs(Gl&I+AJ>H?\s3.C6<%5),Qsr1aA]/*6*@RHa'4+?&m5qsQMo*pIhTe$m)JcZN:)m=m*>>e-Y1lA(bBit69)bb_F(,E-Ul[[mr;#L5_):SZCIS>j321lf4+N%),.HGk@$[6M!Q&WW`[Pe^3\\C3i&=jGdVtF$\X2u33:LM.lk&_/0^eq87cU'YsG2:1?<XYo+\U4p7:36GnI11C%&T#d"+n`]3+XX[3)(lGg5rRWrd.qB$mE]F4U%'[3+@uTNCIG=gt$Ogf!Y)"W3$9+5q'EVa2_7c+cG`CMp:dVS@33DHA5f[Q%U(rGs9K-RN4*@r<EFRF\P<F>%A..T-AP@fIoU?2mX[T%@!X>+JD#`TXojZJ3*$;`GZg@DjC\;psU?%duPda)gZ*)pO-r*`,A1gK(NVmMe_*c`:(pJO['0<a4/'l<4VV#JR3TcYYT-X!R(C81tVAbt%Yc[r6^#WIZBt~>endstream
2133endobj2133endobj
2134% 'R165': class PDFStream 2134% 'R165': class PDFStream
2135165 0 obj2135165 0 obj
2136% page stream2136% page stream
2137<< /Filter [ /ASCII85Decode2137<< /Filter [ /ASCII85Decode
2138 /FlateDecode ]2138 /FlateDecode ]
2139 /Length 1977 >>2139 /Length 1804 >>
2140stream2140stream
2141Gb!#\Iqou`&H+hTmk>FcV^8hBmb7""Q#QBLVA'*V2<N%I+NV08XEmrg-#J&/p,=5lBB"/OZZ'PEn8>&LkfoSU,DFLaDs714-,:T)\@;khN*n>kYS2+dE"*loV^F](:Vt*'?4+A`2e],f'^)!Xr,SS.8El:?bOZ[Mg$))_%Fkue-YRHZ02*N[@8Pqj4\0:<Pb,);lmoQ1Q3J0C4"n)]F)F8Q^[o[`L;A'N]Q$.5q94gn4,=AhUV65m]Br&47prm4\'Bc@Zb+i(m9`$A#+amA\3#l]Eg9WNQ^1dJ,bgudI(4O:hi4i\,`RBE^0nsr[?01[YTJFlh[S$6*e>RG%qjp\#QT=0$<,3I9_8!P4u-Z$iPk"#1B1=kN252iS/H;Jr?0c"bhoFpQ%>>0k/]#3?kjO&P\LPKbSRtoXp)@J1W4.pj;Ip.^hG.Jmrp-oS4YX06*ohNBD<26rYKqhis,=dJ3g4bf62Vdm=#JTrUb&'CEA+G)BV`5g70XGZ1"dEX*bO88&$Z\Xh'b^-L'L=`0>!TQ>V(06Yg*r1E*<c#Gi2m-p1+,_N_(r%P0I:Fi8,Tk#d-g2I]cs'nh]MV3;W,6&F]*U8oT(q:h17</-#B_&V!>bT8bQ3LBLkRim`/WitOc^gJ]%#dZNILZ'6@mtDJLrdO<j48ij+i?(jWNG2$oO#D#uQ"%p'4'P$:H^cL%$T8D#0at"l=&p">gk$>Dd:0sqWUd(I:Y^3_8N0o;k)YjM&S3NI#rS`uUW=$Q;bb@g-e<qbH%mu+jT0t@q2D&/RQhalJtE.^:FRO88Atopb+,Y3PoNYtRP;aC6&'EtKNp01ac)%9nbC+P^i8YIZK)!S&nAt%Sl,,h:??"tR2%M92],p6,oPaRpVi,'p6e^\FN"aqWU-!C;(>fNB<3]">"<7\QM;]V5nL]/NC99n-r6([&)=o!lh7*l"JFmqUl(].Eu53on7@D?g^A2VY05/$f/m6:O>NM'D0J\E$#8OkP,tI42=;b<=u[_b*\J4tE5P][hk<bre+,S7@6V7?rmAd6N)`m=O=BFmZS71L)Z!;]CX1Ak&WOS^U*Z%&;e>"^:uhlNEbadoCE0))5'XeYUu`/2hCocrUcFWW&J:a=)bPK56mP"MLBB5EOASg@p]19",sV=,Xkb-pU'=VifI"g$/M%hVr9io=/Yb@@PGbNmCL8(%%A1($2W;+jE`YlF2Mj3X9t'gsLC+d'VU(pVS.4_R#s2H!>+o&Y=luaDe>kRkM>+B34RKYpVOCmkPssB'<'[";FZ;f]F;.J'(,8n7B1br.H%MlL,QJKnV?o$`TD($Y&tpg)2pW\9b$D8<3E+T6;9[S7-T7>P8m-G"W^84lU7dC]eu'A7'?GmiR8nS4()3ao9Gi6HPfbXOqUcu>mRKkQds9+S>1Z=!Hr8+YA\Vu7cfiBgUjUZQ`tJ*,7Gj?d+5Wr;K\Z#*mhBij?E;;HjrM1)g@8`V)s6o$NG;cFU@8Gjg'\.WE5,BGK@&fpf"=$`_Hq6s%PQ9/1Nope>-N]gDc.>'Lo;^I'6Q6#4t7a5abGlr[)Iu+dIqdN'LoXFK]bAUH8(sN=I.OO*P*q:fJ@U(M1u8s1MAipE7u+beBX?*+=/g[hmm&26/ftr1&LK.\S1j/M`o"V64H.1*W=!8$.h%S`4TjS*;iR7E<<1$8e;'GXBK^0Gl5Z1rpk_'St&rl5OZMb#[+8m#pQk*XXi?_+T2mtWtVUFJ*NQh-&3NOj4tMI=3_hmBY0@f)r9ZE`c0Ihd:]]3nNs2]m-6!i>VA0:FEX^_UX)9&.J6Q5(ThPt20Brk5ktUjE"XXMCjfoJ<aGEeXrDL,VaJo+Q<*-lK\kOD`t5]8c$6V.(Z0bJ(I>7^pYpg5@Ri^3Rqjp8G;l/Q.j&23@n(@)hO*,U3^H!p-JLGecEDoT'T^l4@EXK!.u/RS$/Gma[%=V2GZV]Jelkoh#"_.*$1::@lio%.VtX`NE-h(.bH,p_~>endstream2141Gb!#\D/\/u%/q:js+)RPfEjZ/P4drPrK(S":`pU\g/p'P5]E#aOW*KFkY?-rmmiu1f=4kPWE9cUZ"+otHUp=jScpJ?>5E0)"8k?6Me`\O)^[:ANo@e7#!PdW:S(<WX@CbO^is)%$q:9#3Bd3"[cDF*k"I3Fh6N37SsW]gHoO8TL"=D$&\oY^""j_P5G70YkXRai<%)'F*icidjA4>,n?77ap=gHY^;Ar9qs`2F2]U;NO*/>I<dshuIbaTb!DsG03>[RPZk+?[R>Qd3Zbp\5Y2OJ[7O?FV;+OfdiVidIGU(fG\jk\YiYm\4%(sA:4t1s_#-PX_j(W/(6S`6KADlH.^^;<E9?3]4nl\hiN(o9_SJkBX1+kjs]=>9gl$cr,<Q961Gj0snmDemD5P4[;r[MDUU2e*_#el(Wc&seA"AD3+dlblW#qA5+U]HgTSV:#EK<WEPXCOZ!L]J_sVUJ.W3EZ.5a%)Mp.KN]5*;DHm15Iqh<J`&&!A)EO3V643n1n!;KY.P0=lcN/`_)315^S'F>Y&*&U6l_D@\l;%O/OI#R!?FH/4OMCY6;kKdXE(GH]grTQXgkU`&Cp*p<7KN;\VMC<r/<0_S)-t[3A#tJZCNKB,T;n`sLp"B6RubEnm'*B^1]-(U,;;#ap38DX1%dW`#-K`1M<Ub]:C$%2NA/LFJF$#RP,URFa,8J;n09/M5bn5FsV@<p4`cICN<`h`dVe^L+%6pAnMm^L@s"G/O!6Vp0j-@*U/0K_ti^*;auhm%1Fd46Z/ff>I\KWMoE^"T`E6((P:r'QeSM"9)+Hb`L)3XKIq8As,on/07X,do/nO350H]Ag!:uN;[Sl:W#%`5%9MQJjTYjYu7TiVS1\B:&.Z.k(qcLPj%EAQb=N/*PXc/-_sX=;([kim[HbDU"Nj(eHfu`<@on,mTX?-*RjAZ&Sti'M]"1u@a*A2%#0?-()k#_Dfp<S/m0LE$Gi'F,$<+q9hY-;:]+Z%kN@otW0LbFY'58^,/J@1O^iNYr[oA:O>/AmKj0[W.O"qmf5$)Zp0P_M?,L.)*Ra-a(0#qRF]*k?L4nrTNfOSm@0LacYQp)Lru,qn-IbttgM>Wpe)=3f0H`[oc`sHt^H-\>5>G_E/gp"R_j#4nT>F*5Iq`WGq#X5&*'[?3\MAd$!q,NVVnTo1]O?"oK)SPU)mt3]9!d,EDRMQ/fB.Y+c,NM-0@WOWcY8'rb%aD+knBVL,1#aiWjmUfD*DHBJ;qB-.5G4j<`h++.]I@u+fUIS9lR6_0:?4h+@J\2WE>XiKV#D%*aa.40U/-e]S?tn,VaH^f?&VN/?%`6BkH%g/L1N;d[ZQlW:i['1A/L3=LqCgit/00;90,%J1K3>hlS+[7nksGQ%i_[CQ!j'E]P6PE*0^JHi-`K!RQK2(Kn]"!Q6F!n-9=ckSNfBfiF`rn.dl6(:?`9,8ANQ%IW9k*AEY>K3iRj$_9huLPoaX>&;_(C:&h:HM($ZF<a%$lGkrG3,DZ!6j'tpSOOd"d'T*BC"&M7`?\=G]*5!/=bXt$'_;EO5#[BnCD<a\D'!OEl"Pftp&2h9^bf]`4X*5WAO;DQqVIoP>_`EcBJ?3)p!a$=@840)Y-.^H[9mp'Fnej7I\H(kBnd)7+0?DlH>fL.*a(m[^=OA4F;Zn^P.N?hk$%)RIi^M?p7\4!_2!i&^'2!4GMjDEI2i+3W3/CmMq(2mEl4bnH2@n3o,&-AKNhEjZ.cH'A)t2W[Z7IgKMm2PLE(Zn;Bfl!<kU!'fc:<2?YaE5AMDuHAI$jsH2=s8>Id1^3+))i)GX*-"Xd/VU&~>endstream
2142endobj2142endobj
2143% 'R166': class PDFStream 2143% 'R166': class PDFStream
2144166 0 obj2144166 0 obj
2145% page stream2145% page stream
2146<< /Filter [ /ASCII85Decode2146<< /Filter [ /ASCII85Decode
2147 /FlateDecode ]2147 /FlateDecode ]
2148 /Length 2416 >>2148 /Length 2211 >>
2149stream2149stream
2150Gatm<CQI5[(&^>3r.g1Z$@<Op`U\?kBRk1_Z^Yf8U`$Z;&.]P`6s5Hp;B_krm]Z)iP[BlGlg;mr[O%'&LPP','N,bIU&U'lU;'IfeP/SCO/<5;K4$snp[iWTIeNI4/DQ1):M;j1#2RDO"EVl7rqsUT`7S=ZV2RVE/'cJPI]-PBT>=pF>9fN^1rfYbR]u_s?b`N4FXEWR\)5AEUD(%c#q,+9QSeY-di\MQs*OfScjb<!!XL/8"QLh\2rla%8BYgDnp;g./7\N'X]%\fBunH&ZC3Q18k13O='DF:/pJFHD\rmhN$H2H//)4.Z<j*<bh>g(8V`gp8jMd*.JS75H%`i7)iRN\efR%DhR/J(P+/kI0&`3Z+Gu-6E`hQS'm]n0<C17H8kOcZN_haI)?uBAQJ4'\RK'?>Qnrpa8S$"SOrI-4dl%/qj=l'0/;P^N'gPXF;-LfYPE$9@iDXI[)/k)cZ'7c")N@L9NMF&e(r3dm86aUj-B"_fe2WM'DDVbtpP,S'GN7XYC<R<j#@T+j)OW-Xbp,D[:a[5s.H/H?#j[OHGD@F.qC#MC&T!u?ZX.mffUpQZL?i]mg_8+2H:J8+NaFKo^QbII=2!(*IS<TM9pRLc3W.3lI,fma)l8@$<:Bri3t?=HToD4pN5JMB&+]$LK),m$*:ra)DC.o`N+WNfg/]!/QC4*FR@4@,&sFh$<K^_YeP0s<Tq.[_b2b]&&!?L1qa:;X[#B=kT_Bj#^WNWcJeF)C!(/7eM?9Sq-s[Xge=t5SDk%HO*oZXTbaZs6/X:Kk=cl@:<<<&5<a]nT]3Xl":i!3LZnaOW5pZ\40sV&.V33UpNCkat2o[f/kLm@L3uh?fdo>;)4<&*FaYS/7"oV)paM`+_PQH/d'NH=@o3![sd*1*hqI[])EO*)V!,7kte"02^Z>/>SQ_q<4pi0]U0[?XX(1(a^b%(pJ-@#kYQ;1T!j'"\m[</RZ*OoB-^FuRAB*j?@\Id*4(k#QXER*9cDB2o[\4et02$a:'J%;N#A9)\6,7!_ZP@OO>O_`P!L11fr\^[GlfB2:/Qd<PdO'aT41HTTAcYlsYZSj=T_iO,FpkIei'42a>VVf-L*>H!iH\4i1nQJ^b9mL't:gTAmW!U'JLFg+ce65m@F^0!pe#:\3k9\1D=cN`)-mI?<W2fgi,#_,CK;qoq0Alup8kOM>2k\ml<i4"^Dr\aQ2.ED(qp<uMX4?m84"(TJ@`*s9\%M.qEYEb#WJ(<I(nu7Idrda!VhRk3Vt4$I<FN*t?`7&;@R'OTg2D-N:k3SET9n5p:tdB#>_J5=74CGhQ"mik&8o`<`sV?/X?5:<>ubj>G)0EJ=oqEO:q(*M_P8t48u:8E::P-!`=qaM,KN*=,#(u]lH7(3oiMZ]n$r)G"8SGR6%^ouRO2@UIXNWqWeI+:R9#),LY]QaL)m)\^%8Tqj)362d!"'th<rZf6c5dp5AY!%Un-'W7eQ`ATuk?gX#G:>#%>tn?%[CjgMZ?NM:(EL6n[e4\*?3KR+qB7T\GOF-aN6^#B$oiOF9&"$#71K]dM+e:930;jhT#alZ\is/ttmK%G>\l`[>nIe%<M4?(8tdC%3uA4>3<#H,N5HnDgZ+MQQc%C1#I)EPbj8LfDT7_?G"0[.X+XG<b!CpA\k2hmqetGA"t="W0R[q3[GbLU2/F8\]9,V#%^O5CVn,As`8#r!6;&CGr4_j)KmY_:pp#9No>)boA)1.5s5qV9iQ`#t1/bgEhNc-E"7Yo&oVUn%H7!2auFPf4b1sar=-di#IeQ:3lfp',A?#>pDfN&92lF\:50Gi*8XXi^1?Km/"3+r>So%IALF5C@FLZDp]lr;PE5W;he&qkH52qbNd7#?'$jb=2'j=D7W`A,`9;(C"YJN($[^<!r*Z8oUI^f6tV'3<siWgBXo"4S;d`jQ)<1rY*+GtaYqB5RQ`NI)FW4J+gai2]W]b0^TK*La?]1GTs'lT:[JTiOjU=2AVH]+We4TQj/B7!\$5I]'+Ph.5K7<3ImT&,/Ub0k=&I[*`J''(qI),+iG?L;nL!ifI^)h\h%'ecR<DpCBI!eX28l^;]2*WujccjJ"50"JmNUej._2j1*"Qs:Ts^k5TtYMJMu0R)+O_-'g&cU'o6^mMg>M3fAQcn`l5&gb3%rl2s%k98b18i^"[1rE_JoP3&CI<CD^+JtKH13Jnp?J7NL(:J9/,7"EX>gteSQqKB0hbW.URSIg+kpc&n>Up7G(Z,%?!;2nO-^;H<dZXqh4B$ooPikb5"eK_p#9bBNUanmuK<4riL,]n]8H[mVUhf+1U^J8)pYN3YoPQOet)B^DCs;oAL^<PR3!Op('k>bT7mc?&aT6VN"(FbO9RUR:rB+NTb]Mbo;id>qZ!@Z+%*NQdKY[Xkk<37O)fFHstk1^oc9tEc9EKIeI,A&rkf~>endstream2150Gau0Dmr-r=&H*Xms2-"q@&G\X99sF+6T]C,ZN^]^Y4^?VFYV5UA[.OmQ)*F9^Y^'rT1NP/JX7-<A;bY-O7+.Y'LEW9L$j.G#P_d3c`]\A,8fMR`^($.>Bi4j5PonY(9['G-8=f\K5P^pi0s8D?Tr.p.m7Oro'?J-m/3sNDUm5-1CUd"(FB\=0UcL++XE9pU$GorJ)n&h&f=_g/=9UC%LZ\QGAX!P/E7W/>0Wbhl;#]+=u'Tt#qfZY%7\Y`aM/eSN4VAt/C*YfAq(n7`cFtaX_O>`P)nA.*+/\k0`U(rl:F*,_]\e);klYr==?<gKEN%of,UlDKdP(bI3)esE0GpWV%ds]`n4$d`^(0bV+PCA@\snRk\7g`NTKaA=I2=<,tp;&bt@o:JkTjL>,@S#J[1Yh+Uk7`I$GCF%P7bPDm!&9/R'jS-AJ=O0?^2Mm'ER6NA,MkAU1<YP5hbB:$KRM4%S?EDf;J+['qMr<[]uJO"+AH#TL6uE#$<h.u,i7Khn>lF"XR^!lcFgl1jg'N.)`T:.g<#p3gf8#`XquS2^!Mp7B4?UN4+(+=q8]jNT$MQQ<'")Nbbg@R=['e9?cQ9su5+NbksE2R<;;'noL*e=Cth1I0LO$V)]$f`XSH"j8S35)G#nneJN=&\.2@6tp;V=-/RoLPkCl&2^PS)fq+Ur`+!U%=Ck[$*XC)oOk-MDq70<ZZ=(YiI1&?]c]>+SmTSk:LH%M$UQ$T?6WIp6<`jm%1SL4>0*(BL[2Z=G_3%]aqN\DM&j!XYc^i3B&#;WbW?*0bdd(#fpO2[pVSAOl4)tWcWIf&E/`+;JqOa?NtOtU&P]-oG^(11SBbO81YVVKWRQkBO\bEtFE['OC_?O`Xfc089U\Qq4o29K'B5km9P,f\!::_MaiUK?4.m\6TWBa>$n_2RI`iTM>PjJg$/_u[h,@Lk09N_.lt[ng0uX^$WA`,\:?hGT^m&;3=L8Q#o=1UIjpnkk9HVT'm5lPeaj>5,F.f5mM2.uk#M.ukjjn&l0^Acp=Od\b"0-AhAj_EnrN"t<"mb1\nm3iLd:RfEU5O;RD2A>dPSJt]9FE2FUpf':0P@+rU,%0aUY?p#U[:&/4e[cs,WT,E?oko4_cAQk*a`-346?0q]7I&fIsbu.n$X3[]>n!jj-oSJ$jE(LWZDK<D$6#U^:G4TJ>$CmNjX8%Y[5aB^)S'@ooYI1;iG_'c?dCtPZ&SDqg&A,Yn!FXT`3l&DLX-)p#>IcSMr"?\?cl`RJVVY<J22J/Z?Lf."R\=CedZDP\MVd?5RNFI_SBLO+;mN9)nfM_*O^_XC4J#o1E_$Z:RlM8RV'r10'0:YY4ch3a++KcW+#4r#Ue%80X9u["IH'.Gu4"/(Y)i;pf-cd&a7/PR\DNWo0'91[()9f[dYr**u:N;6r"kd\p:XVGLG!n4kQs`D*8iT8c-P,,R2$B.[(SKh!k?nZI?jn_C(rPe1>q!S':9pQJ/+Rk;t+H90s/+:S78_G/nd:^Z-8-4W01BeQA&d7fk5qeADOEG+fNMF_UCFrR@@WiW*sh^;-c_*<+[=3;@GZdDIH"V/ue;rnNuBA<d[AuHK>i=]dcf)!C/](pbG4kr[]aO=9S'k@)W7b]q@e%Tt/A'Ji;!A9KgAE1WtD=ch_W?NRgaJ1otoE0=P%8Q-M`(j@Z-_Er%j#/?-`K08V0DtV3rbS;U8I3a`E%EkT'L2R$.`Z/Dd6`EHQ$#.4WJ\d%j:XsD%%_cL1U*"?OB-YGh-ob@C>>dTQ?!thCL=LdV3oY7U6u]U^S'8,_7A?X)luOL<L<>!bE%]tQ/$2HZ&P%2gHW$n)m6T'^GPgUH,l7%k?Ybt,7>*jAA</oY6:eu[`doAHE'RDl21*Vel8O7TsbKDnIn=$`_U<W,Zn?M#T$dB&8=F;@[!g+3+->i,\I2GMCgomVG1?Y;&ckpQHg%9MG?+L!NiB/@Q7DX/`</1(.t/CJ,:JNLgGY.bVq-Y7??+Uq1`\ZGY%i!nPFg"#kgWuI/.eaX*"e5]2YmBHjRDlTCk9"k\b16r<5FQ_"sq3?T2=KL?\/^H"*$5OXR?8GYcXkmKVItQ$Y[NK<XZJO%8N&j#`M^N*pn<)KN'0g)o-JHHRZ)lGF&hB0#6MVL)t<cK[BHK<%:fYTIBD32SSI<Ad-Nh[LcXk0U<#6U0i>dEk<cI9+4_]j+EdSiNI+g(er2".^-GEpo^\r9QYKm&]I~>endstream
2151endobj2151endobj
2152% 'R167': class PDFStream 2152% 'R167': class PDFStream
2153167 0 obj2153167 0 obj
2154% page stream2154% page stream
2155<< /Filter [ /ASCII85Decode2155<< /Filter [ /ASCII85Decode
2156 /FlateDecode ]2156 /FlateDecode ]
2157 /Length 2097 >>2157 /Length 2372 >>
2158stream2158stream
2159Gau0DCN%rc'`B'qs5AF[ljg%2q4/!Ecu$l?+PX3P6T<N65YI?\L*AL<MOXS@*E%b:WT,gLQ3;bTo%n_<mZWO-Mr-Ml:C<ibVY&k)VRT.FN8d-95gsd8R3!FIF*J6THcHd<%u6_DjCeU__h5-F%*u:0QubC'@"o[CFMh.c3';`.G\*X+TkON06^i8u'E@lug*t?]WD35dPet]!r\5U?`IrUh;O9n<C#seP"g=QTLk"s5<MEEc(<<Q"AWt^3fun"brBShM!o2[N,9FhaLEhg,?t)rB*cGP;%FLnlQCOh_iTu_03!1aROlRcjEbWX]/E)nJ_BubA<&3KM6n[Ye$"G"?XPSF/]q#JmpP1>T(JH4sZ.@AI3ccPt0e)dYVqs1%;p);eS1@7d5SnM>MAm1gQGVe>G&B,AmF*'7+opUPKaMETCr=C.6=>JJ/i^YI7E$&?3AHdsA\!)XjB<i,\Li(N16DPK>igKQKq-8=2T"R0Xb#22=#))(j>G1B,s^i,Ae(-&:qUDbT2)GAW2Ljmd5ZcT-+DO.<YfR\f`2E#aMf?YG$R.+#j\lkkY/0q!:U1tTPH/aP(E$n"l-pkX_hea&[j1A*;Ys\"_EsM*!gOa$5:4EK_$a77LmlG:]g1-f0muCJ3]pj+5PYOL+Nb8i*(WG93QrAU;BJXk)[$3jEk/M!R"&p^eC82U>Z_ANi:GO-k[t9agGKhHF9/,Xe.R^jK1<qD+2tC7au1[ia^c74^/6,He7Z[jWMor+&VX?Q@8f41G-QB/B#"K`&fR;bhD#dZHh0RDH2n7:X"(Me+(C+13MOHo-TNtD0W%>PAK*<@c")Kc`CO@`G)O/gb*\P8U_&aV^P"_KGu?-WYJ$pdEYqc"4%PJ54&ssZ_WDU.#>Kg65W6@8r6Qt!`jZ7rmDMo7Zl+l?OT7*Aft0O#g`>moBR./.:a2I?W(KX6+]lD$NFBc:POnoGFlU(E!$%8oM'sRe3'j]G:+I7SFfCR^XM@N/R1JTg\V?RYWq>F*`:!sXP`SCU(rQF"814_T>mh0p`K[/rBRs3239JL9df"3@rlT'De6ulO8gI%=%FdI$Lrm$RNP=miju/%KMbF+a!]Y"C8+=jhg7#TnYjo`dK!]JBnthonhK+"a"V9FFqJ-gprr_%(rbe\rpm;`N>DSB[.s@3bb@j?7JrpbTc`bCW;CQD7SfOIM(T//!B"<:QM7Z4Ij?Q)\C93SbF-['b<6XB7qdr\_ZcuJcF6'Z6c0.G](2sCUK!URi+%QlPe/H;Y.NHS1e"+fL2Y4$(CDGNIZ+Ss$`]^2M2tS"*akWIB2JumDQgd:XeF"n)g&c/0m'VMh#C#Nmq9s)gXu5R<aXW]G?\M:"_^YTk_pRZ1h_g@iERrIIeJQ4rtBnlnpAQ*DpWu53M0"5aNQ?2fT;@m7E<()aH+<SGB01W&g7oRL.F&S<CYYRjL49moiNc-a6OS4C8s_-&nE4ZFZ#L*dG(?NQ&7)S<[a8V0JcXsa'bHU.:H:]Uijp1k$h3`GX\q1a]8^;?n8C)6_LV7.7["39_rgTaZ3]6V)F*I`'9!/V?2#G;7IOKHE`-S>B4%G_L@b$7t*,s1!bCMHAe-g)2"lY7nN"YaT9M>,%LeQ+<QuQa!:c\;$7$/$USr>I!<s1Nh6%B>1<3rWm.W91<8ejqfpb?Gh+&)8%m49qrimB'k6UWT?g)1Y,oK7n]%OM.Y$%Q\;5f(N8k]:I%VWhKYlRtGC.ATc8Ug6H;.bqGFNsbpYf=WPi#q]lhaJR^MiiEn;2nmb'jdIotI[)oFih$.TZ8,hB+tpepN5,Vmu'C3;ouJ?J"rJO*VIZ8%gtj&8Z<(\8C[nhOQe!A;7-ZHDW<^bO)C%WMoGbOg(78r-2s+*bA$dj&79V^Q4hY^7Rm7UF2eUEb>4q)eI<6a[4'q=Q'^I'UKfKWD`RO%sq05-U(NPM!A<lrg#SG-f>D3Fd->tb)a.r#n$.^qJ]_b-eGtU,I_)tgnXDe;'"Dqg&=->0@&7@?=05]\sIDh8U9VSYou9o%6@"SiFlH9eeJAEBoYr/aVJ)Q<,FXuV$\+b[!Ui+WVK<;Rk7jX8_b2C_AtC6\U[0)@;[*S%M/O@gR"`9~>endstream2159Gatm<CN%re(B#9ss5@E&$bHL2NGQXY$;;8h9Y6d^m%W6\[oh-G5tdH]7Nu-$Wg!8OF"ScnOn3=?o\kQN?Cq$Rk?^3H6i;q]CJkfDI7c0M`YA/]RSc2+L,;&k2q.`=YPWZdoB^]gj.iC5E,n(WRf0q7^9]RN[M7TAoUW3qJ+#'RC)?bo0Gna%LaFr1Z,%#Hf`$Q=T2R\6)(hXKc%Z+p;P1R(G@bUEUWdEODc+[Rdg,Q$S@s1?Ju2mgqK"ppT3Yj"d;_#=;.)*uMPGW[D;</)?M_fZ7tM*04;f7nY*V/N!mlbe6Z/nJV7@j#gbj@EB'E;%XJ@\$[`)mA,dLOIk5S`(T@^8RmlK;#V^r2(ku$Wn<)uSKO7D2q`HlB'pLt<^p?;4n7I)D2Slo!TPtPV8+m.0-c/umb-rDE`duc-U(B%=8`2)trm+8_Vr4Q/#?:o-9ZE[p$!YLUh:+J8AcFWBpKB(*Goe3-P4q9W[(HX8,&ZVieRoQ6R36'_Bc,hC>X_";g*#ARN1s"FJcsIIn.rkBHAEhf&N=S%,r-ImPGs-N1/,-TU$ElY>YJ$HKPPif8+!*oM-WKjZ_bPWP3V'^II;:l`$Ejc1//"cDD\'bL+%=([NPq[Ac<OE.P>r]jL%9!oW2\>mnP,r+'Yn35)NH2mkQru$#Q9"d'EA`4$q*]@R-)/?V9mX^Z;i&RqqgRU^]0@,h=F7:OK@X]q;4.Z[9'(NY,O,;')H5)-a5q#j.4t$j9uYG4KTm*7X$sdSH]hWZ;nLej`A_==\;D0V!_.W*l4B<!j"4^2NL[8'a:b/ATPK+175[iS)ZZ*C=?F>/#WhmL]^^24o=>X:q2%<&d..26fKpg#.-<@;i/oI.pp-ARX_PgL1QXX\-1,.LUaIf=<=8MV-hU_i"8LMAX2=.;ar^KoA-6_:<a/g"eW-I=QOC%W\W"#VD>h"n0uu!h.X@%b.4m\ju%<2P!"-8'gB-2d_A`m%P]o-VbHounZYY(?(6]el5KeZ"YaBm$"p>A^c+ZQZ]G/>m]KMdZn/&00@BntR`sYAQ8@FO3mI=oW^Z?t(&We?6<BLa^;1o"'%d8%jUPh>-Bo/)68,iBQ^(<n-+ngcV6Cq'N>b*=,YD--Mhk7nMClfEelrnKou%5`CE%6/(@75"\AXJ*S!E"Cf9+`79Zu/F>X]0eH8PEef)D?%E:-q&;i7W:NS*#-4aLKY\e[F(V,R2+dWnN?#*?p(bT_%VGc(b:e3%is^q#`iOs:=h:":#1!Y-K=2&XN>%%!Z3JLN!V>>Hs3q+^?UgMW3@=ULuc=i!j-=RHZd93*h0SOJuFNX87.8<ArKoKmTcL#R9dgaV/H4;@i^^gKJ_s-WFO/7R:RVN_(a(R8+D"%ZS;_I*n;gcuA\geoIK;b9[o%r<3GU0+'ipq1]+d"]#!K+s]n&tn@r1R)&p*[,:b*D4$U<3HU7_Yes%8KLe%Aqr5p(LY(=*$l*\on_e`H3'N"FU\?(5RL1*b>'2lmRl)?abf;i6\C88<@R(7(DJp2CnM3$3P>p>SHOFCn<$;p9MO8,cmA`9OBu71.A&nS9$(Qa4*X>t7TLrOls^o*1N%)ul.3+-(e;po'b%'@DUrrU.(_d<H?T7#Clr3#)B@Tu`.%OsL95(?^$&>b]j?&*nXVb[&+'qslk&'b_k!mr+-3k3rOO4#""%VBAidYR$`4E%T5,KHG<7,fC*$BDR2%W,q6o0Cgau6XH!prpD%u$HG09].^K)=EUH>mC=.,c?R<D0YK+Vd$8^\u/GK%5*jI$0T+R8=As3\[r8@:?+(5'E<%)LIC2sT>Cr-B%8'PeJf?L8dD[U(n*!oBM"rBfsaJeTC8pc"k<)dK0#dl)FE`oCb'bi>QZk>Ere96T-$6J`doShs4!1J;10K%TRgi,F4H#=]a^!h>$si']bTT%`h:G\V*8a2]cdr1Nre&:\'n_UK1_%k<Ic0m$HbWpUL#Mh2e<o%25V$n;,@US&s[I52I>)is.TjslKd`\?_EDUH?5n=BMB*^As^N>jMNKJ=J6"]JGr?qp2!B59+F\VBr7Y+t/D]&=o2MD*>0=grW,.cY$ads1M[;&T&%]>pX%AeU25VSNkuA$:_XF,%ib5srO[fYWaShb.%CDgXOC8Gc,Yg[96Ji`&_mN5@O)L0:rK@+:AJ<3B%(f-uac(heLSR.]5$PoJBl)@lStE..!Wromn;01k?$p!^t,]iJLQBl;O1Nu-05m]kGlP0m[>G8JPAQG\c="8(UBj'dH9e)?9KNr-nIUE7KfpO*ULF"sSVG@tS%),?_.hbDQY<Y,)Fk]h2+C>3D.)nB_/a%4Ej2i[$IkI=hudSV+RFW;qif*_B$g8dGpUX9A?H5*B^q[OBUGeE&nmI0u[k<0,s~>endstream
2160endobj2160endobj
2161% 'R168': class PDFStream 2161% 'R168': class PDFStream
2162168 0 obj2162168 0 obj
2163% page stream2163% page stream
2164<< /Filter [ /ASCII85Decode2164<< /Filter [ /ASCII85Decode
2165 /FlateDecode ]2165 /FlateDecode ]
2166 /Length 1896 >>2166 /Length 1841 >>
2167stream2167stream
2168Gb!#]D/Yn7&H3_"s'\mk<)P`p?u0eYHq9_bbphr>'&WB"EO$?^bgsSXh8QPolYgrdgq%?=#9d@daTfC>qs6,Fo7d?qr--@t>QDF*^tDos*#BqN31fNRj9FI7NfQ@E+$&YlIK9@dB_R.!J9-a3I_-=Oje<kidH$T!EdZ@q6cJEe#R*E9ErrQJQk[&^%tS%0d.]J,OfHQ*OOdtOMM'&"j?+d""JUF03!6-N4GQmtJq@HWhM`1KeY9uZ;">5sS3ULKnsZ/cj<I?)(uToCJDKPGmSgCb2pd?7ckDj7Rd93LB\e=h06aVe%W/C2h?8gR+k_H^p)4JOHV>pI!`WIe'Q/(]Er,L.;`\Mi?&71nP/SoX?G)XYpTZLEK;WJf=`FL[T0M;r<R()&gI6]2(b^_2IKV<S.1((,>&o`*&[T'A,sGHePlY5g+]q'B1K(BON?]54"*3]/!>Q=Z7h^k1aFX[$,iZ4`R$Td:i_$K]&O+Q60U;u!.J7BPA0kE!)/kJ_i[H!GR\mjE:m=WDS1d0/1hQ!0Pr%44=4tUWolf]XClS]q\$:>gICH43=qX7mBOr+Qq0QGr]o)K7Vq]e_jrR\PLP3];D+$12N^4d^iQ5sSK7P%bc,b#nB(V67&m@t9^1B<QO8`iH-dK4pf6Ke"g2E^k*b:M[1,R*.J\.sa:pJ>'?X'j&#Ur*I!Bpce8bei-aP#tRDW`_=HQDuUAFA=<m.udiMX'gV3uS=`0&:,FZBW`>*e8'e-=3@!V^1+>6&*,*Z--ZH`J'b0a]T<]HeB6rT5Ms1T;nU:+pZcFJpbh$MT"cmj-S[/0JR5Qb'/P<SPObK29#`a@TJ&Xada7i%ab)_4OMZOLI[YR,BI#kqE<nQ%s)Z.*6_3n7;P2YT9e8W_6@EnbiCqc1g*g8Zkg?S<9Krd;P0OUKYiq$1jQgaV+Y]QTY06^@qU_4n63d&:j_^pVq^k9H[CkZ:.qp57icn]^ctO*AoVl$VpqEpHFW7ZJeH$kbS+_8<)<Ogd)$9M=.\IM$6FLIp,hup]V=L%'9"BgP9;DN<M;F!*^/CNarkZ8FOmQc)>P;"jt0JO<`6KIN7uV%d/=^-jMAY#fIn1U:s.,.V$FELomh,]`k9@"fCsXFEX/0/*h'B0='p:HLS0CPo3Z]#J?hIn8+q+YlF/0M&*IgKXeq)5HI@psa"9p"mL@A4>Ej\#af,DK9NB*n[%s</<a_jn\W73?Dio5d)aWs!+#f]kVJfkboK9%K3cE^Y3Tp!4P+h;;6"Y!Z'$iME]4h;Ye]$2eirtQa<E#lCY\=VY8l[Ojc?-7AjD7lF`9(NP7YG5j:?C.F<`Q2!j<#$UGq,dqd,\00I9NaPp,/3U@J<_T?H[^"[A7N-CI"/&0IY4f#d#W&B5$taN)3UaIJ-[E(.LLp.pe^%g\]OuPE_N5LK9@?a?7t`!Mc+?7a<c!EMfd%S72u!Ni0J7Ve=I6OkU"59WnUS-Wlj(:0+s^6Ll!1\C!X[18=m].uIFAh9$m;;*&(-gFTo:K!5Wrl\$p\:0GOc]"=NmN*7K^4,nI5[DU_s67ELM4Sm]_npokRj0_Di+$\,U8I7,no7dc,IQ:5OAcq$Yh)]`NmJc/ECZ?UJ2mbl/h!m(iY"a$Y>3P\FFaaN,OdO^W-98t9mIc7Xo6q3K\u;3kp\47B[)aO8kOESHTU9>3[4^Pe<*W$2iL.Q7G"uZ9$^u%@JY!?(JhTbB1g>;O"Q.+7^I:V;(q]N,=CJDt?1&pl0\N9eqL=G9c6)BFRs,\OUs-KhE$*qEHiq60_&okM-j[f'UKS$a,_Cs/CUg,g3gF`t$1uJYch6YpBK4_3+cMAM6oHAJ+R>uRqj*>L=a@-l!f!)b\A"*4I[7nMelltLfV=Sn[[:'4FWYPSs)-;)I.SLa[G@P~>endstream2168Gb!#\D,91]&H7^.J!_m+!j[3Yo4D0G&fbkeU3H6cg.G(n2YK2b_d<4`fAY.bhjM^s"Gi7Dr_O/gZ$0e$5Po]fM*5P2Y@g);']=?=n#eeBHl0f[FkdH8DW#PSGjt+i^g!o-#LMp_h,\J-@*ITG&%@G:R7`l%4M#*]*?MTS;DgX#^kBlj0*!q]6&HER&5[q.rkF$Hh[S.UT](jn1Mlskpi?RjY:qrE`IEA;^XI6%II"@Cjh'j?,9B4>V('l=,0[9jLIXRoQLD6YDPtA=#JgTGm\m>o1Z>!d&onC!QiTD4C'KCQ3b173jrf5s#S]4OP4JsuFcdMK(]oQ@`a*%l%PjE,iY<Eu5a3"YKS(s2>g#Z379$Jos5b\aX*OL\CTSmkdnE0<(/%/,>R3-</;?(H+q2$5@`fJiK#o.p1,GtoF<;2WiaX,XhV'H!VL[^/?m6pL!XDgA@@YVG8-.k8F(p9k.VPDp`=.J5"*AjKQPEu!r;HNeCO=cCcH$;2_kU6-L$4hk>Fg6gdK'SBp_T)I?fZ0L9`beKJ@?X\0>lZ_SaX2(=uAOBn$<GuYSf15[`Q8<l0\N#H%_^aa;_G"Pe'-)rUnnSA;/,5"%'1LokU61A-gH]Thsc0%h/gSocbZa?/'8N(ukJh/N(i37lZ"D\(s51bL6<$]Wu_[<V2'c\r0W-T!";j\=Bb/CTh&U=^8orjeTB!rHld!gHOQQboEXtUTIbhp%B3Zk(\A"+_\L$plWeCMmkf-W0Ms:aQQga1,I=qAh9LCNZ=a&OmphN._$-JOdoa_7.Y9FFFnt4ZVY_?_?jT_D!VJ7Osa?M<KHPGJL<7p'5WcA**(n"GsW-VpIQ,E-cfF66RUm(R@L^o'%F$A/N46Znf0)$!&SM*%*V#jJ]X!7D-6Q5Z!o-e,EcTOFu_8pa@noo3t"uQ'YGE4Vs^E$-PS1gc'tiJq>L8'^R7%"_a;bL-MHREk3NE>ZO0BgUG98-LZGl;f6Skd@rBTAG^:N"S<Cq5&!,IIBa:b4S]D0s%&*8Z,SB8b64>'%$nYP^Z4tBB4n.-7VU1R+EKP9uB-)bp5_d9PM$P1q]2Ht^M^tZ#VWeKiV7Ej[BS<N<AI9I3#cAZr!f>;C.qs)?`S;J:,smDW#Zm31P,Mi+N_a79#3:VSqSOr)]IZX[8"dC@iYd#2p+3Zf4l)-&c=X7aF)/`(rFM9j\7C>p@<4bs:HrE2CEID;]fQ&SYURtWAte$=7SGA7p!Xn0)b.Gkak=\TFiq`%Jh0r$d,>]toM=,3[W:A/)#g!bq8a$12_l$O-<uKW`]E?;+3u)Hhg)M(ZUJP?NXP?S@_%5#fp'1^]e445m8aCOY`61T]4]`fLWr[.n"_3.Uk2h'bZQ)X/C9D0JZKne4@"V@/1dD9I_UIt-tPiCH)Aga^PNd:Rp4S0<U^%^5?301Jd3]:6%?sRr1[jWE.4d&#:A.>7X<ZH,sME"'fZ^lN335S-Mu<>32#`@&HNQtiK9sWA6ssU^P*Zm0R";QcMY%!bkBlgWQ:&8"?!YuU$qcc_(<WF5#^WNRoB4h7+TC%,;_O:7[)GBf@c=f5#>QEW4CS*03Ou8^8kSQ::jhZqGK!#_Pnq&s.mZ;9Ae?X,'7f8"@po(DD%!?:iUe5'kS&e'?["!"r4Sq]^i_\s.MfPS<0iL^%qksj]pZ;_73!],(rBaV8Q5@eC[5_clmQ#M5DUtloX\pGV/e&gg@brIo`N:6Qc-0lGmqi0:XB[%3*.:m59:M0iqV_qgrJ.*P^X+oX_a/*6RD7fZ;%B%_<M9CjSDlp,n2%='kZk'Y8bJp%pYri`lP/CUO)UF*g(Im`nkD-#;+L]sqc94STF[ND+^~>endstream
2169endobj2169endobj
2170% 'R169': class PDFStream 2170% 'R169': class PDFStream
2171169 0 obj2171169 0 obj
2172% page stream2172% page stream
2173<< /Filter [ /ASCII85Decode2173<< /Filter [ /ASCII85Decode
2174 /FlateDecode ]2174 /FlateDecode ]
2175 /Length 1384 >>2175 /Length 1769 >>
2176stream2176stream
2177Gb!$G95iiK&:j3Rr#b'!fEkO-P,sETn0.0W5_*\0DN*u%5X7o*bsi=GP"sU,oc6qr@rJ\NCrk6WLb-8p_iHUDOW54sT4@:\!V#CpI^sX;EFGGi1Ub=X^P1S.rSBd;T!Rf'7M,F14c1QuNp6:eRL,F&;%TR;3[97KHR%!>/GhREkj7H9,FB9,JIdm/+6i>J$r`UGaR>Hph%r1ZkB&F08O9JCM8dGh$^gr'o1PjtTDqi#4L3dQ'lft=-K1XF3&-2Q-gQAMMC?J;O@l`t\[Zli%G/)0BAcW8<ZmC%[(*cPLg&UjRB`8W\[6M,Y)BpC&uX7j]Cr+2f:rqhld8[6qK?4.QpuM1lfZh>E(5$?j*)W5pib0?%KKh[0'#.7*RLNKC$F&FheZ6K_Bt)/j5&c)CkCSi-Y]n^-FJ1ARO6VP=XKHg%C6eCmi:e!B0bYaa'3gN6LDFD@FjGpXc-NJGhYFbUJ]Zl:ro&(SJ[g`Yna.j)S%G5rJCCmienn5*QJu<MCPNJ<R0*'W9@;oA\:ulkch*0mb#;(.`g5V=PE2<Ic.qq&E&Ve%R\$M3KXrW`:EFC9@Oc@YA"@Jcg1/+^B1gB-n#QNchS5"3C=c!GQo"j)ng@*XD#JV%1l'Tq+-4h`3ONRBQUGYlpMiuL76ab)R#L"BYe&Rjc*"CNUFloh%tXuP_tbU9n>i';;4#8>&g5Y-HQA:1*Mofk<s=;kbeAS[%D7dQB3*;Ot<Tfl#,5IF\q&L0]siGi?AFT";d.476\'e1Kd/ZK]t9<IJ?SC=BT%J`nu>ICq^H8IFJJqD".>^D3CcS+Xss*;)';bS<J%U+F">H;Pmtr(s7ftGjq9ol+3f/_ro$F#M6%MY0bs#p3)!XPa*-TBQ6/2dt.:cApPp'RN45"]j=[mgMY'XC\`t<g8*(%cE;Mprl&JEV7K-o>RYbqWnt2'E+$*nAQjl>bsl0c$S/q?!KDVtZOot5]ij*`n43[,EDE@0eQ]^U,,$.@"q@)7lPsB2jFNVAY3ZaQV\Mj*5Qo'd7rkQtr)Es$&_h+*'ND2ZC;9'!DU`7ofqdcM#pdbOlgjW*W@^NKi<a4o(N^[l>eeH=Z9_@bZY%UB@=1D=GQnRoQ^Qhs#5L^uc3\2jpDf\pQYBaCTftd!K#*:=8DML@+m:\$gW-NU#>;Lgn4uU3c9T841*LF(m%TAGTg,Zeic)U*E*PH!kR>LC*PC7g*tqH)AJk>Q%,jV/k)jDcV!6Kb\jHPq*T@5,jtj5sr68k^\+p<B-U)WLX\%og36Uft8[ND-$s0bSpe3In0]/c)UA%-<h6B*Lr8:C@SZM!"`jbOVj>sFtD9$aG?V">G]FA?Sph6XEBI%H\Ek"2ubDdK'#gE1>R:V*cn]g6d774ia+%u)-jT~>endstream2177Gb!#\D/\/e&H3^ns5?d^YWF7j--NT!^`TkZ/IH#Wep-S;Gq^Y)QJ#*/8lBZb?b[gs.rh%\Z_7AA&4q725()e>];#Tor:B8rScSaDJb->lGWne:i!!uuP:Ll63Bd1aHK&f<%O2f##&Z(476'H%jL8nr(ID_%CRSKA8PW'-[]<(t:Jd]ccf%>Ia`)h46q2W9b#cqakQ4.<o,5Z6RA;+e/>m7:bt1Bq9I+`8d@KOF="e"Q"X^ug4Fd;4.Hn>ATocpc`\cJiKX2%W`4X<-Y)-a7#Gi`ie*5'S0`6J@[*K.QZ-;Qr&pG<D,rZjapuX.$h+bGB/[+>lmBL4lAq^F@/6j=%@%;h1nFssR5hTP\,C=c'Kqj2<4WemSGWdkLrP2hT<FOr/DX6[/<Z$RHg\5#p$;'\uHHFYfVr.-Rb><toM2agR5MWu8N@9+)O"2@\&9h*JdEDdWFDa*A0td]B`9eFFU@&#BL8l)Sq5q8_B`>V^V9!&M'H'd;Y,"ZOY\ih][4YdVT<EoA#\RjH'3E9IS4LoeS>u2LX=2Y4aFAc;1I^CG:!Uu<B>n%-7D:S*%@'VOMQ`^QFA[&\W'JV$faA;=mQ2Ri[/(S>-u=RN\CYM_;lsFZ8iq!9]k2\M;UA'O'k8SrPt!]?<TDSL<_G>X6:s*FZ((06a=.[;8(0Rt]*(h2`7/0iJE=QQ,1&T".O6W';m9G'M455KX@S?W#o&W\DWK?3ej'diAlbIY<F4Wq"a0QD9b8=oh!?n)8`upLm#JfTqEesXm>C[s"*T/QR;fojpbDC4L42j;QkRaq5$3j1TPj#ri^)CHDY<`'$3#'e'"K*Q2eq$Lei^Xl$6aDUj0;[+C/7*NM5$>1NfEiWGN/;YbAkjZKZ7RamPXRf$ek6_QYQ`C%$PI7(9E*S.)fZN;[)T8P-XOi_US]-j'3j<MCPQjp-qZZT3XRg>5$2u]/MrWT`]LlQ]9!%%"gGYnU\[cisOmsLkARJDHZNJ*aZ0FP8e_90\ONIE(&4/^*aEe7mrgGK9&\^':]cI,Lie;H9#KXKMc6Q>Z5aF@bmL5[-"-$hcA5i[R0:$gBtt`B%a;'1_7(lDUa2\7!/;7)X&1R]frCr^u&0#>f<QA,>.*Y.?2Ti[Ik!aoV3Y*fClc>&!$utS#hf&ZTWM,'5JXk-C1)0Z]W,@&M`]0:`+Foq[(!ibL>mR@='qRjG.S5N2&E(]_7ltB1fXBBVrg>Qtb<tD4oH%%=\Q]i^\I@r^C6X`T^+5)$YU0j*52[ErEha?1W&gEKu`MDkC1\]LVp>pa`iSJ)Ig"!a]rB'O8`OmZPif-PI+MYg=K#H.ZJS?5M+%EYuEF(!J\5-5.%#PN?Y$R<DTW3ErS%nsEq<X:/Ts1:LEII`QuQ7E84ZG%i^c5A;J<ZPD0'D&=>:QKJL6de,fUR,qd05YSIe=Z=@[-49fp5Cbc`S.r!a7,OmF2Mj<*I^1S"RXkc"8ZA_PgG\ZXWUO0.oGQ\:+VULq`INVTnu?,cN@Ej$j6N-XF7bMT=IEU6`HTAEet7a<Dt8S%`k*KfVHo>m9XEh<=`ZllEJNJUj,cAH.:FV\Nm00,UZ7On/#M/"`k$e@f;4dHCaOk>(2,?,(8@YEg&!Z&'Jd"ZLWFWW%BbJGpJtiYW;GNGlijf3]q0[\2a\[AUJ8a[`mam"mGa#AE,kgt510V"BHB5ac\'Vr+1S(b&FR]>Cl=Jo>tGI)N2q>J7n?t2]Q&iI$uiuW6RukLa5LWC/jJp^0XTFVG*Zp.#QsON7DnB3J)-5qP5~>endstream
2178endobj2178endobj
2179% 'R170': class PDFStream 2179% 'R170': class PDFStream
2180170 0 obj2180170 0 obj
2181% page stream2181% page stream
2182<< /Filter [ /ASCII85Decode2182<< /Filter [ /ASCII85Decode
2183 /FlateDecode ]2183 /FlateDecode ]
2184 /Length 1465 >>2184 /Length 1614 >>
2185stream2185stream
2186Gb!#\>AN7g'Ri"959(G2S732u@S&3E+`00BOD`L+]2+/:Q:BF^P"(iWg$uiGR?;kiFsCN3\d=$\SiPD@^@-;_R,G/br^Jo`Df`G"Z,(TkSq-32*mAQ]j*Wh2)@l+GD%K#fSQ_4r(?1qEi2:of'/"="'TMR<+N)%6//>5E!"JAifcaH@b]ECf5c>]VqY:mr3I>?A-k<*3CDKiF.><87>X;+bb2Z-^rsSFj9d"r!MT,)rYrnS%S:I[=fn&j;FVA4Rg?gLR(^XAdTe`p\1:FR@,\&Q+>Y$OiYATkBa!g+jQ-gCf]FMoh/a"OHNb*H3Ukjk`@8-nu[]ERs;AG=']T>r])T-S'=Cj%+Bskq>c[<q%g7l\Q[-;:<^Lor,\?6PGjiqE4Tl'W(!Fmi635dqZE`slc$NX-3/Bm,Em4`qF$@>Den0b(>-n<bV,\`R'T,3hGKpXpW:Pe?2?3iJL+L4KOgkh?h*N)!qh>mkFTK=-?`PHZYF@Tg?31'nYG<!%hi"'@t23#A6XJ0VL_)nP#[cUN3q.:N,.?hOc;FG#VP80!`X[A5T8Qh:pL5SPR,WRbtNGj*=p7s^[/q?-L]Z_e,X"n3d$D`1_X@P&rog(**8VPlY6#s>!'_$]@KPOJkh@"n>KqJufK0?H5PR(hh7*u_cgZrK!/^tQ)8LrbRqFko:^I$u?`!#WpPUq-6W\iFB&qNI?gcR&m!`.%T4'2;Q^)f[X_m0\)lC9;.Mre[61p.K7NEMeTVH[)(7eb=l6347T-4s96@9>7]/:d%12N@qm@Oe=T^$$Yj/8<$n[Q!_Yn-tgkd3_self-<onO^-8XNaU@?E2Wcf^oO)h<A3BAK]`ti-f'E,HYhGflPJ9(-Ko<n/Wq7U"G9Lk!?L"*0+dICT0L7a#t:.92:rDkg8"g_Vu>e1>TAI+imWO92g1BK2!`@UCtM\Ci;V9Jleue#WgD"UoKU=[,VUSj;>-@AQ=]a3s5Nq(P5*`2epOgq3'Z2"U0rk)sj(<OtEd-&X0)d9qT)?)7nJ85.S!UA?q+W6*!8]_&3m=^Hf@/)%t<uKhjST[cHnJ5r.nZ"P<$\;!Wo&>W_;4c?FfY`9hQ#X.f&$e\$kdS1m'@C?[a,-h,tY"Zp^W1S&XnBE(594KnL_[!.=YjR);Ns#c$$7e=?^s.AB"N-P$NG4Ze^:U1k%8ulWiEY]Z%BJXB)r%6%U0Q3F^$'(;.]?7?OL5XGJ9$21$0tr_p^,Qh\m,t+L\Q8uBR+*2C&&nk;pg?9fM(1HF-X.?2HYe`j/Kh9qmm32/Ne?`u&A2[<rU]"NIB$rm[@`;t&&F5]6]HZs5Ct%4eCZL/T"n`OCL(b2\ZL!tGI9r$!XAgteZD/^UG(b3hi]9jhg^521r3l+gO3o7BXd/Lf$'c_V`%;K!G&ShEUZIn3]9mcT'^i*%TC<G',XBe]*o`UHo_&cd+;>6L,;EpBG%_e8/d58rrA;!h9#~>endstream2186Gb!#\>>O9='Rm78s)9gCMLrF5\MR$CG[Qk()JOAM*@dX1Xk^j/]d.U%SX09P4a,786O7EQ5b`"tcfI6\chSP"HMD9F^L7K=`s=<dCp4os`F+%Y#G^bWFjt:l[p+$`FqB0gF=f-_#.USeqX%V9R#@1W7AG2R8A!D.9?"9o6A)=e2XYXn`>!_/+OD_B/'o=uJ3U1?,7]>)?:]qq+Vt`MJ7YQo`j;_HEu=i\UPj0+r],379r;k=[rbMAs.UqaGN.uc$m2AA`PTs-DTX2MI4!7Zk6IJ,"'3912"&#^+C1#+<-LbHN]VPq:6t"qZZQ"6[*A%,A!08k8m$iJfpH!5r0@A?,,TD``Bh`s<*Nd+"='+`9(Okhd_(0"6;"O0+@^@5^k=/I'.&^K&VJ&]Kejj'!_FYm>d-m>:lSU<isVD*Uf>T`A?@EIK)]mgo0Hd[9l&Sf?!pt-raEVf)XI=A*D)I)HZAS_(nY0K*J<fa6.6ZUIiZHKlc,KS6c?kdV3re6P6rJ%DJJij(uEX)*?>Jmj:[AS(gPC-4ol)cY^%%0(C]l*3:slGPWV,>rF"9JQ*iT9*TT@;oEY?WF?BR4I]ka^hZZA9LT[^I_Ws-nj9^oeHREKll`"?ta@Jp=iNW3OTj@A=p'KGa3P=3i5.n]2%.2I^fLKbEIjRQU\4b?S,&k^l<J*TpDb`l'Cqmb.AM;8@Q<`o>Ml;aOs2M%<Ur;#m3.jpVc[4ofg7LOT?7t[Je=bO_.QZc!RWG/819hHMZ0!<?&Q)fS;@-[d3Rs-"b.JplHZ:$[@QU%mo%Y(:#GhTq5e0>fMjMKcLf#.,:.Qta,+'n^;+@MUI<BZDM`V?-GYC_Yg_>X\9ait"RidYt,P'7"iVL@s["LcR?M2L.\h;t8h9R2j>W4X:R+SY$LT!f%nX?fQ"?blW:EUjMnA#ofT0Yh(KAdD"7*1'clr%mC4d)V6DhDGI"9`6;N]?3%(e-;.JQ5DVNSuI4b!Nc'@OSOnVCoB'dXrga6I#$L0@[RIG&B(.0-ndUMX--&4"K0%1\ehm).o_ZkXh";TpAuGqC52Rn;K\iCM%*Pp[6n#+:G9%(!_V3<_*pqEj<9&@FE$G65+(P4B$a)`e&!)>jRin^(343T:j9MlnaJ`/9kpD.\>t,\@K4QY1B"'DMH_o,mdu/.9!_liMjh2<$jj[ZT8Cd2_U>IY"*8_XfhC2BdI8DLbWHAgglOe/8,er5t1$,K)d[)+X>+_`)FYlBQ?_G?mRD@UJ'X2CA3P/<`._&7pmF([&_Y;V92WC3l1.#\n8>#SS-^U^gt:QN$@A+.f[:m01sKAF?qs(@D+.i5&K%3kcQ'V<HWEICf2Cc>06*9,tL>!AuRW>iu0I0$(mG)L1Y3/C*n0[SH2#Hjt2TCicqrl'oc`?\JlkaK`'R-!$N/1L'fkSb?WpUE2S;H8$rMD4tn6t]$aYRRYn]PAG88A(QUeQL1X$fr0,AQW#\\:1Ed]lE23MGh@I5#%.er#=hPj4E\q_h_!6=R]'K8NK)Id!^s2g:pdns@BGU"Ao<$giWfWq3pNLK@LjkH),Y-jWl&Ln-oPBl+;Wo?(SUn%F4\O^Aa-RIlQLC<P#0+hL>/Y9)8OL,_5Q13T:]~>endstream
2187endobj2187endobj
2188% 'R171': class PDFStream 2188% 'R171': class PDFStream
2189171 0 obj2189171 0 obj
2190% page stream2190% page stream
2191<< /Filter [ /ASCII85Decode2191<< /Filter [ /ASCII85Decode
2192 /FlateDecode ]2192 /FlateDecode ]
2193 /Length 1175 >>2193 /Length 1187 >>
2194stream2194stream
2195Gb!#]@;hVr'`B(%s5?RG:J.OB@Y:qRoKKoH/Q/E_bPIs2pS$#G^`dN%>2/;1rV@B=CX]:l<$7;qBq)n$Q_SV_NrafIIo-(b(BFK:iG=>N@9@FJq2Q!O$[BFXcYhl$e/V+!:dQ.gL!6,ETDc;u@T0:Y)^CL\=+!2QlU+Z5T@nh[(P]h8?!%(.XK'UHs"@dM0'?EUIlu$iDG'Tq"P-pgrMIU5r!_;'*S_GLZ!Z/U&3JlT^hjGgERi3OHqYN0YY,5u9#LpE<@#n>LoZ4Fq<%>;lD0%:j>oTa2S@ro)Qjj]KVXQNKoh%YXH]B;b%,g@EjUfK,RtcSNO@-qG8U](lEA;A(^YfnqWo&Y9V4sp\;\D)9a:t-oiL>"e+%/c]V*##4(VjsVu`[m_AkiN/fi^q1];;p6pdHf9.j._S-K\d+mnj.4:k+TE6Un)J5/Op!)LEcM,+@ub^2e2oAct"X/_,A*Ai"IImq(&L_'7,eIoG,VdPk<bijcf:uYXbh=>Uo4QVtg1Ac>HmZ)LJfRPUN)?V.cf3bf#bJgCY6Q7s[0%[.s&?PrXQH\L!$F+FV(7+qtR@HcBSjgq1OkX5>UR`uVF7c1TP?ff4o^KL&&j?`M9lH:J<EVRd;(/+%j#a_F-GaL%XS-71o>,"T<<Dl0`RWgrPq"""ja/D"l.1A6D%/"eU:_44B?._Ni1)s/LT=Cl?gt=bU.[hek70LeYEf_DK-ug.fB3)D(Uei0*J*$jh'k`)O-("u8Xu-Yam<;Jn>JF&7,j>:^dQWAYRr'n=(8e*ig(#J"72O-PpM9K&FH/p$I&%sI+2N&,>a&G&]2[;PF:9V&Mc('D7Q\Gm*Z>0;ogOM$qAn625F@?=6>S[Rhgr[\r.TQn.^%o31qMWQ*"='F7CQZ-gGZ^Nd!k['XA,?kQmL/P-X2l<buK4]]`U]0ud.2@-k02*4ViA/?3miW!.n3'O2GO2M16Q[.Kn3'R3P1?0&=(9Xj!Afh->nKs4-2kp4=@Vr5)kL#[H]D'_"8Sd'gPIgWp5lFe)F7NpntQ18?ZNm(H#0Yt)se.343q^CD8.)eHhn6Y)iHZ<3W=>+n%J$7/V;J_"!1-X?]5!%H=^(U\r337,(lNOt[Y'Kr)V[#ZO4`YV%YQ09W"k't[o2uS'*aiDg;cllR^St(2[NZ:Oa[O*pp(N_$<6t~>endstream2195Gb!#\?#SIU'R_pus);>"3.mo\UdRcXp94u^&0P]#e1:7N(J:E5XnkRZW_N?U9.Kp7;JS%$e2D,1+$A`WqV7i=,&m2o[GOO^nAbs?-3t0;f`I8uGVHa\^LkC"_f1-,pBDcD^@/R?'^@Ej_(Sa'(UYZZ;EUL*_1i'$]iAU\JHeL]%OZp4W<mqX%=VuNDd`3M_5)bMC<8oIhHe"b5FDE'ZMsf[fQ/(gQPbDqk$Xg,5,r?gl_GtTV3oEk$D\;[Q-CrmLOjloZSm<[YEU[_j6@:.)Eo67?7a)=Ga3<c`>CG=QsY$4#.Y62)\\pR;aVee#q\g1I9l@RipcSSM#'cm^+q+5r<:oS%)o&HX5^BW#h2BC`H_M.&DCKP*CBOoFg*hfH_2AB&/6(iHXm&alnaDMXN4>;C&s6i8k]jCBOE6/WM!Q_ZE3YN94o96q6^1Y5E]T*'6/A6!PdmI^9<5?=R6`Iltk%Fe';nr\lc98qkoABKk0Ge2UUpe>4dPr"o&/I0Krh\DoqZ<HQa%sfcKPjR?,]3NSP'VptdHYZ<'']j=G]+8+qB$,CaBOQ#tW2HPYK%Kg4B4^#1HSdIZaPj/7%MG@\KVrH7mF/]:?N\mo293R!NdMll#C"I0!:no*jNWETW6pXc-f+cn*3JNn%X1#(8KB1>FJcbUt8%BTG;0!?e)f`,n_ifeG&8j^DD3b>c=0KBB5,]7;O.!,3u.:Y!5X#jAL1hU_2J0SOP/s"6Z%\aWHB!4]PVVX<m-MAXANqoa^4[*"h3AiLbl:;$IqCD-WK"-6+2NQ4>O*,@O\WX!eR'p=?\^&M<=N5AuAGU\n*tLku,)\("N.GC2Lb0hJE^9`^L@ObB]#7F=^^saFoY$i)>R(J.rDhBX=m-r@frcZHFn_i9e#)%V@X&mt7GHgIkcL#)W(Vq@$9>3Ipr]t-<M5WtVGCs[k(?Y_'<,<&`e'$p#H"5U=^4'Th.0.^Wn&"j4D"JFVk"EHe7+tce\ad%onq:9l#]K&&S/5tNg:6NeiT$$PNq&[)\!p88&L?lHk%`"(`38Ye?5Pl74hS(qjV>6pS3Sj6+\4uf=TEl'ENq2>+(pn)VqeiHc'=fI<l?HI)1M>,4@keN:sL=7+A.3(jgrIZAJ$QnsO'9+Or:>C,&_?Y8\f.Zq.6="ao+c_P*8OD)XmeQDm=VT=gOJ$jYYjYe/jA~>endstream
2196endobj2196endobj
2197% 'R172': class PDFStream 2197% 'R172': class PDFStream
2198172 0 obj2198172 0 obj
2199% page stream2199% page stream
2200<< /Filter [ /ASCII85Decode2200<< /Filter [ /ASCII85Decode
2201 /FlateDecode ]2201 /FlateDecode ]
2202 /Length 1016 >>2202 /Length 1030 >>
2203stream2203stream
2204Gb!$H?#/1K'Sc&Yq%)Y#OGr1%ZK.)'D.A2a#$m^V>m,ag.u@>3c6S[Xs*fi0[nYVr[YU:a#^3Gu3IWr6V,p.ERkLdkdh:Tf*'Sa=J2#4!J;?^'5(bN[n`]^lKH@:U@YcH*r&BPX4lar%$d%"c/=G'O]3pe]7t,lcgl+`M?uoZdJeu>;1`7KnpBfjXq$\U.M5VPtd[QC-c#d7u:g3!jZ^=KrrX7lWlPb5b.YIL;mTYGG=9Ujh!mE%PCY1D)'n!!(4O%$6Qmc:BcQH_d/Z.^OlbV'q"2KM906Dq;1T<7d1gJ8`)3eBEX6^6g&ujS5KaIG3s%b)&;?%\TV'NV2qOUD3LG8)P]ad"ueA#^%3>`)lY.8ou5jt,r[.d$$p2=4A9JGbhU0X.BWiRI)@n(V-&O.1cd*`%Y&6a3hMYOO=;HC*fOs1]I<-q&2MJ[SW*u[R8:g=oJ#E#Q.'<5H/024\a\Oa9r1EB=*%7+ZA&3(6T)f[I0>Hpl29U_%PQi5n8*-P#Tj$fYd#i\MU^k)8=Cq.OrBBi6*8/r.+K1Qb:d,69.3nJQkNC.A7"@XYj3)J[jcC9a)AoZFR&Pe(Rb/>-ae#Dp$_E9_]("M]tmkYVBEHtf<K-]^=^aMB(KcmhnC9=%i(7!n8ehBC#iR1KY%0<jjB<<0)S7d94jFC?W1C#V<Ka2CKOc*I]hjekM=+`'*f]f*f`57UYKlU-jO-^Sc(c2J>647S[8nV)-/SC,3aL"\m%VjtI*8h)RS6=H<QF)s@*jUC&KgBb[`OE']SY7%+oE?aLm3,(QI+dbhTZG!+FiI=Eqf;OT$OSI*R0,"Y_Lm!MdWYhf^qtpg@"KrR='$`P-K\q'[M=g@iPeP&-a'RQ'KUj;_@ccG@-X((JUp_6,f._UP%Qd"$rOA-2lS0kHrim&@k7>!nI7+?h43Z%TA<3qnWJugLG<<[UL5UUaB,$P<]cURZctcIEM*&8Jh2K4^r'"il/BAYXq#L>(DgL^D\gl+/keZSr8ODY4SfEnmZS"~>endstream2204Gb!$H?#/1K'Sc&Yq%!_M+=Y:9AB>q,gVsGM%(\>5]*JPY<YDUES4W"Srqe-^Z6a?(gEL*%+P=LkkP4$"Q!PD\Dn`1L9hU"\;g@mG!Q$Nr![8\:kla1DLP,'5!SUfu`=Po3q/I%:0uLinCWVp./=G'O]4R38#C_*#>R^obi-noBJeu>31`7Kn[gD']q#j0nOf0D'def18c#d7u:g3!j2&hTbq@0;<FU_]LPsKd.G:g`4;[#=e!mE%P93?5+bsmR,b=fpDB!_"B]RoDRQSQlB/n"2LOt3\2f7p7pH@Q:s??goe\]E<Ic:+V`C<pXA35.FV9pea1rr5g3(j0cS[SW3#;BKDZ";>%?7QOu1]q$1jTr<>$2UY_aOVN88ehcT9G+Gc_#eN%"""5"/n(cJjekDNgHRsc6]Fg&Dog+.CJfQ9/*_TLNbN[G,1lD.&\hq>8<-O+olO9L5l@\<K+E/I74!r9SU.ZoF?<:8S*#/-5F/^7kdp,gDXrf\3%#O".kUq\nGIkDK<I2`^h0^D'l%AU@6JP/9g@-q372M@839c(f''!/c8ahRa]18Q/\]5)@U^poS`"iQ[O](S(*n`AjLb,Ws!tNhtV)<9I'T-.:q0)mG0Y(rd%:\;H*&,2E-ER^j;3dF-B$R?@4b>5$gA-$P`57fto6;rXr0h[U/%P,3+r=K`>=DDHXW!O>**X7;#CJiGLXsO:9.!WS1nU7f>]PsIeR^bXeAAFMJ.l&[Zpm%Li_EH;`Dbg,4WIhFL+.8V-u@kr*3erbbZ\d?00Ph?7Y;<]kB;;2.'i>Y*RHo'"Do(_Kbb`T!?GWXg02rcq#IT%UVOah3FILkr7aFR]e@TH_ei9Lr;(\J![oZsb:iE<HlIsh9d-[A=qmR;;pqC<r59YRIZ"gU#5)17]RP]WO<VOQm@AdL1qMY89'Q^e^t\0NE3ipA%RV=s-CB$L8AjI)ZAqedKid=C;"okW9CL(_i\615be.-u9;"96E)]?]rE$f%;6K:5,7NnY89L56'@@da\S2ljIKM(uT&]~>endstream
2205endobj2205endobj
2206% 'R173': class PDFStream 2206% 'R173': class PDFStream
2207173 0 obj2207173 0 obj
2208% page stream2208% page stream
2209<< /Filter [ /ASCII85Decode2209<< /Filter [ /ASCII85Decode
2210 /FlateDecode ]2210 /FlateDecode ]
2211 /Length 1017 >>2211 /Length 981 >>
2212stream2212stream
2213Gb!$HhliJ&'Z]**r#a5-&mYp@L%=9<D9J4rEJ_<f@1O]^@T@TF\@-"]s8<;IVK^dk1m4Ph!<_L)4un!Nhh&Yo?W@'&"i-T1?G/jZ0I0jf^>hR9LNgjboPH]Wk@;C86:)YNMBdPpGk>GgfX;It<JkW/<7(0VXUc/YnONn$cLV*V,"N'3+bZdd&68UKQn0VtKM@jU$cWo]=iirZOn%7J3ecWF,VSI%55e?5mlIso)=F[XaE85j59%%b4lr0'XU_(!QP7L3m0ks+fF0Z;dH1#gq3!FOquMmFXqUFr7NP[#dCb$?JgH50'E*D36%liDXYCS[Ki3$EE7(.2.%&_TRi1E86FKc!K'rTm"!rQ1pM_XZ!u7!$d^iZ.KX+W$?I6BFHN8Xpp[0mB;AN7ik"+9H#gu@Tgk56jO>+DZ\;a[KO>%Z+jH9N;+LrjDQd;CB#(j6T$1YnV#VPY[*X)3?jf.+F2[YFs+Kr`VHB;4a'C;eED&iI%)M5!cU"=psC'o6`R.rh:]VK#gHGB5#*eLKi^>FREC*pSE9#:/U+q8l%a$UD<?[ImhMlM0S7Jp7B+\L.(8Y0qAbA(FKP3uEk+"rY0TW_[4@Dl@F-pbDfWF@@uO9rp*-G)tK?>/<@H@S@6]N?\S,CeY5GJ6]D<9TDQQYLSfV]SW25$sOmiQQUUK.RM"0q7J8Y1b^!K.Pg2mEskE_M*+tUGDLUd5X+kE+M2Z#qRWq0qH(*kf,\'0Hq9%XTq=eKh)"fUUReJCe0pm?TuaOe`\NTQX>\']GZTE:;O@-AZ_Mdk+uU#1CT-m*80_k!JM:iXHg[]5K^Y_LVUc[ot\DQY[=8cDcc6s-8Q#"/6l9f:lpAI1PTq`[Ub'1[4l1$`tHp?/.?j@@aln#Rh/BeW8E9djupdS\e%6]\,`(BEmG5l:ij4&f8C/Yhb;=^TeF^bZ1#U3$*Ico3^ulr:7eRR*nLXc5%m#u)2+V;T:^3/&F;D:X<X;9bMi%mY%i%aJpLFqcEbe/JWM5q%HGi3_'Xuj~>endstream2213Gb!$H;/b/B&BE[jp^[$RM,l$_*SX0Z[RlrFW=Q)R,8)cJ5dnU>N[q6hIO6?m[*tOI=:7YJT]GP9EW5k7"@6^mW-uo@J57&qs+15ZaL6Ui5Tm[kce3F2CH=bZF5mC48qSfh'6DE?nnt/>[T4-p>&4sZn`_<8:K>$k`!#G0M\lR'A<k7J6ZPk^*8fYiCcR\:D!Lql&lNdVe.N\%$FsBtgd(Q8ZJ2gBDf<c@@=X-!&O'8^0<5*EfSD+qL"IqhN@;8WfPo*%2]r$)"f;;<!=TYHm.rCC=Z$#@O;lGg*L5ZY"U[n:OSjSV/4%/m[4db6F/:OpbeXE`NKju`_].20*K#SqY*I;8k'Oq:Q]Po%.uoDpDd<l50H/fS<ZHH=2l0X<Xcs6U'c+f!crc`G%iX1gflL^KG$$#nKFJ<Kj"[JaA_;XhG$+%p=O*"GTd1\3hU3hCTXQ:"6WXgfaV\!CL62_+4Y_5g1!cO+H='l6QR'Zi1mc.C5Ku'^'`)gB^^urp6$EVYrcIn-lMR/D^\(!63X4gp`g:q6hW>sOJsSi8-;)`A88j_PGd?1.r\j%*#u/a.2i8WgRKlI7_5pcg*OoijNHg-l#]]?L*e7W'UXg7&jW%c#JfNS"oo\1^_4C6eEk,O]M;Z=gTm7ct*"6"H,3O;M0aB#+;M(m#:\+Q4E\M/iTtJr\H_XsRS*#8nkhsaf9MA6<PD\!PT[^fE?(V4V*UK/YK:u*W>,[e`jHcj;FhJp[@*1Sc+V&[s%hi)I[1[)Z1d-12E\M#FGT[4rB'8\tMYOjt9%Bs-P-U09f#N?DC&$!=J5GIfaf`r;Bmj+-Y00<c/t8#>Yqc?6&i(8_FkUbPMaRbCHWpVs2au$_`Yd^\#FP.iHZ?!L^>j#(\G-F*?)mMCB3,a?Js9,U)+1ed9"keX@L^T"qS;]pk4^qJ,+gW_2T,qNNWL30O\VO6nGOQ_EMR!DrQD.aZ7llAdT9coVNX4UXGUi~>endstream
2214endobj2214endobj
2215% 'R174': class PDFStream 2215% 'R174': class PDFStream
2216174 0 obj2216174 0 obj
2217% page stream2217% page stream
2218<< /Filter [ /ASCII85Decode2218<< /Filter [ /ASCII85Decode
2219 /FlateDecode ]2219 /FlateDecode ]
2220 /Length 991 >>2220 /Length 962 >>
2221stream2221stream
2222Gb!$Hd;%Di'Sc&YH%uK3OI"g-Z6\2:gVsGM%(\&-]*K+i<YDUESB:')^AVS$?CSCQ[YU:a#YqUa:-O\fSR4_ARl>(GP60\@'&J"&J1rN5J;?^'\U]aal/_#LJe%O0&VQBpIM>:ab]NFP6A\F9$Egd-0=^#jM;R*g[aU'>fT$=VGS)J71IDFF4[E%s?bgJ8P9m#9E`37C\^!eRPua=.Y0P=#q#crG9b(O&Ud9A=%o'tAQN]Ot!mE/0)q].uk2L-Zb%*B17)#(AjFrsgau*Os]mVme9Kb-41<B3W.l,X],T4p43.8$8R!R0[a20#W]P]g9<4=325?C1N;RK?l9F=qJTb(5C\"]&sA&BhM!?[2R=)TIY)gO$Yhsr8MEFhJFM!E/9/--\r`X]4\1q\-]@hCKHI+qPu0>"1Xi>C(2`n5k=hG_gi^)^6,1^qDI^6E%2inK'a1fsO`@-1jkX/ZgD$-+1*1^Hi)_B3f)<Uft1_@3T#l6(VOi?aDVP8!Ef#;Ve0AL6cEU8nnt'TGC[8JjG6eVt.)UYZ,[62A^*cWQ\D$0te?-C)q2k=4JdLb'^fJ]M^aR8plX.hBJd(^--AB6&<L4[?:(f-$*oTW^Xl@F"`Cr^l]L%I!_Bd))P<J3ki8=`5_/NG\%u40]>)KB<.A[d[kAZ'7\JcCeo<('a0u=E&(ba806_q?5cu_N[&g_CW?%?RAQLU=qWn?(#lQTbc5'!M$sBP4aV%a9qSP(lU'%R0,.WKdCfP7>G=[HZj]j.(!r'%_(X5Z`n!NYRh2#ef2eR^"o7+o^)*E?t%k2:dPp%Y*2cDMY]>(jBG`qdrU<`P8:G;Ds.P!B3M82#O%\YmIRa5S<sG67rr-kg[gR5dtJXUeesiXB:!(7._XbUG^&Zq0#^:.+VXB"oRkNo'/*s^*QLuNN1@)b4Bk0qZek<7RW"7=aLdiNlXKr0#9FAE8;H)Cpi\Jqh.\RolkD=`>aU=4fqUb@e&bsrNg9t~>endstream2222Gb!$H@>gU/(rtMMqAgUoKAJSXM+N[#DAsN'3k4!nYnmX8WbLdrYtOGlqt<[r3nbOZ25crr'O0jd`ubhAr@%g*^/=is'EE&]Gl7XD_@S@$&W]1>L\L=\nma^Hqu;Bj6:sD58)3MgS\2VdE`qZo<0^.\Kbi-o?iO-0VA!1<fe6akEJP"763qtJ!8i3s_sDQD8k@-9>=_bN.Ou7$8nVm]HZ9)V2i(hk4ad7,%H;`ECE*910'I9k?sfm<_H)(djY(bCXG+)/DeDQ%b=gK)?<k<9(t7=UVB-TU)ru?^0K)h*PuonWG+7Zf@1i2-o:o_6Fe@M#BWA/FG8M=>=SHMNJ.>$(kP&dRV@pI$*h>s.e[7Du;8Bb=o`0q)l9<;hAb7UaLCLLFe^mT<>JNdXe\8[<Frt,1qkcV'4@&fkH"l?WGhA-lD]fJ/&@Ib]!MXb*DpA,P%O<#]Y0nF0+BR/]V7F63;Gi8t2<sR-:_4^9S5MQg+ANk(A[-$K$PpVT(_W'd6&u?K#YWcH+Z(+TjX_QcJ3;XDg#t2*QmbhQ1WeQg$jfS.MY*OFHST1XP>(%C"t#/#0a)C0*Am+.(3=D`pjFNt/p.7Bc]hDj,o"cEZ'$L1KFVHL!$CL!@ScU5p3qgMP7<$G4)!91e?HV,jIg#];o+TKIQc3ggH4C)-8ki@k29MC#[r'ee3UqU^_8]KfEi?VdfV=J&?u-s&GlqUeu&bIa?dW<T*,ihB\7#0PVRZ/D#uA`r+XL'=dhqdMgHBi7TSoi0aBWV!"j44ZI=UbQ'ldh1Cjg4ghZs=a?dqnL#S]-aELIfrorq+bsM,_G89D@,(Tnq58D#Z1Qd=_64@;_"ErJONSKc0RYq?^\c)jnE[eCqM**>;YW'D:M\p$G20<+K(CMnB(1=S/NC^e<MsnP-l=&fQM6Hu;!tU00V>Y<mHoYAGG>Z1YIFG-$jk<`<arVQ[9IG;i[KDPg~>endstream
2223endobj2223endobj
2224% 'R175': class PDFStream 2224% 'R175': class PDFStream
2225175 0 obj2225175 0 obj
2226% page stream2226% page stream
2227<< /Filter [ /ASCII85Decode2227<< /Filter [ /ASCII85Decode
2228 /FlateDecode ]2228 /FlateDecode ]
2229 /Length 1810 >>2229 /Length 1647 >>
2230stream2230stream
2231Gb!#]CMt+O'`B(%s5@jk'kES'R=TXFrR=jeW=mTj>GU(I8<K;pi5T8&D,2V\^=Sq],`Mk)THt*O1\SB"a7n]3LE?HkmPW5ihMpL=XUfj\iu.UoDZJf0r&$Z&qg*_Rf43hDi\:"NaY:Okk@_Qe.lrkD-cXO"Sg\W.eoO4/r;6s(RsFr<]EH57>)4?,"qpfY"PlXN8B>=Fk#<1,QkZ3Q@U_O3]S,ek)#rPSr::S]6-fr4V9s']KMP_Nra^*TRMm>jWMgt]4m?_(B9UN.f80X(2`Lh$r14]F?B5haq#3ODP,a]*$9/\ua=G?2emqObkn=Ln0DYY@M%Y;f\)"'F;+,(m%"1B+Wi/IfDKO$W+^;pBUA_e##i^O:r][tpS5MHV\J,S=Jgc:gFKoa;DkJ4V^J:dNmI/FmcmJ8VpYVOLTd%BRdn"!+mNbL[5(ssr%YH"ei3bCrRFNrM:)M$LOHIF/3'p)PeBs"!o@.oc!7@(g9qt"%$<]C]P;S?'c]mWt;grNl]X^b@-*\4)@aJ,^ONMMtof/Fe/!=sm[bfdDp"4.7Z]`dM%"9BT^h='58A)HU5Cm8075(h#>PR\@jf-HQ(^ZhlhMlu*YJ;u"I&7,)$>C8T_&ZC6AH=#"jsAU($b-BBH$,8$(Laj^klRb@]XsDAL6E5'X9o;.J6<Eas4r[;@"mfcp5Nf82.A!S.g;>]MS0FrWS7b?K5,b@#NGuA3>GL*hVp%"a\kQ,")N]G[`64LcC*%`A7gCZ3aUtVQpD*e9;^(-/niB5LI+S6H5\`sK>6e'QV=lWG:aF?;\W+Y;QQ)as"h9Q!Zc-\8?pP*\0?PS$Le>OGYRR26T53pn,_i,ZF;&^p^;!e,ts04l-uMe$bHm"_m0s\lZ)&8ZTP-'6TDfsH^T'>QAQQe,YNb3=-/_MUP*?4>Jk.+=M"XEP`ONJM/(scNE_QEZ]H'#KQCBt#J"sUZjP+*IVi:JGHHlW4Ag/9.iKa?A:IV.T3Tsj`+f"%?F'Zd0o^8>D0!)O(p__k7Fu.jBr.h0bg>gun[9NO9PIFBYcItEk?GIA>0Dq1qGNV!2hs_&[.r2c/QA8sS82a#%@M?Fl9$*CcEaWe/rA]cNGt3"L9R:b&&Q-(OmC`[EQ&Vp8sC*X>+i?u<7ZnD0ZhuGZsb_"*1[C'%V$p1Zt!(kWTc;9aNeLnSPs%4KD..-;ema.YaGSZ:;:3'fLU']6H>,S3903fG5?@K8Sa+WH+pa>oCT;<*j4t;jh^cS/LiR@2Yq7U62Ob:pT@G^%M)eOqH,?\f4VKpN7%AI>oNh5\4e!RMD7Zqn#VNl7_aGgcK[R5e,f#oVY;][]e2U4r.8eCDW$Ec>^U"+_("N:6=Q4aQ)RNMY-:HJ8_HRK/oerH.pWLfYY+.<HsD'P#&%iE,&XN`&PXje``ebgRlQQZj302\-27ftVg/+N9]n!2NJ%JWa^XRX,n#HSb0,atN*WNiWe<S]9Hd>gV>1E/Agt-6*pCoQNKPNVY*qc01k72Um1SkRfKY(2<R=O%E3?M")5lrskU$Q>Vf7S%HG^sIUT-A_Rh5R<E!ds>59:m)`8l5r-;&G5MLIBAL%CEKp5\XlC84AQ;jDfV$BM7cTQc'B]$W.[8*XBL#/:rq18DEq<7Nq5/t.(-%D-e3]BeXXQJ&=GL-=k>EHG<Nn:[3hON$ABi"lQ;h^A%n*;=kJd!V=e@4Mg1*Y,516^->emR08`;g<Zh!BrD;<&^L0Ae-SB&#1h)MXfc,!9eH,ORs+u^a=l9/D&5@EX2d6G[cG-?fUY?M6.oj]dRpI9q7JqHcucUB8_N9ZQH?*_e]~>endstream2231Gb!#]D/\Dn&H7^.J!d9YK!*aj]SG@AhWZMl7!61KUq;nR.[(^4D.6Gu=dFPeA!6n@d6^[)UFulccckFiO(USkL*?QMju"akI\4F+XUV]@P<%9ejhYI9InmSGVf'PX`eG(Y^2FIU;1pj`cEHtocFG?Z;Dbp3Joj(A1K5p:*HYE<\H,eE9F?^i6DO]OqXYR#dlufRn@1"t;ab2eJQ*h'Ms9=L9YS@(K>I'O.i@-iEgji^DGg2T;#pS@F:Ka.8PUAePR-n@m7Wno#J`krVjH""a5cr\G6YG,6Rui0(1(Z62(],3j:EoZaL@oDT9^V*Ru?uB=ptp93!k3!dVXOKheoUL@l^56;.NP1Jo:lj:mLV4+?=>d>ehqQj4MV!HTX;<;sT/E-5_L#OE^YcdpCm:$6JYWEnl-7_seXDY9,akV-^^.ECTLGBu]naF%F!YlaE.+V'87>SS/4X6%hAAOr^)\1A6K@$cuLI8ZQl[L^,Sjc6;Y&U"_oj72GGf;6ek@+,F#=e;!.Ic6;:qT%?<O78=[Q\=g?EjH1@#7d#kH4`!mM5LIV2K)"k$L#A\+8Y.ZZ\BZL#P/Y6Mm>a[!OE'+?KF[Al5=uJ6F/%k#3i%A5R*$c;a:1pYfNKE<5G:k785@8J).0Y8NMCrLGn!Cjjj-5<-Zj2WE9!J8X<#R1X-V['C?uTp\+cf?)4f-\25')#6ZB,GSEPVIXp'!#':QA)fm31N=!-jji5e-VQ"tpqa4\:RHGP986eS.CE-3+NmHKEa0^&nUj?hs=B'%^i>*C-8'C4r7WQ+W>Ss26`J`%7K)g@LP#NF"=gC]B2.sQ./<bfN:1lloJ6#l[GF#X*;]L!t(i[\#J_mi=<J3+qrb9`)R>Ei5O0An&d-oMn5l6<=X/5FU"`ndO\An[.+eTse1A"`=i&-(LG#I$\dMsNNj:eL@+E%GX4Q;]ohj>8bf_<8%*?>75$V6HUd+8`MG"d5[TU/qNO*8Tfs%l:f<R"SJ:;S:McH3;5&7X-C=4@;KdI=^f^nL/pGD8BS*QE*\s3U^`Z#Y\'N3K(.?1Ajr?>a?eFKcnQ<U2X6:1F1lj2WH+6G88pQAAKXp[tn@OfXei%k+'>J#W/G/:+u6%YRL,diR*r<#'*`Y1s+*M^;bMV1uVI:&&/a%WUSpdiY$#@;d7;s^_g/;\.!E'+/NQ^ftc>TQXnQF5tphh-e1R8^#(Z!F,XJFQM"P.j46Ab[*;p>0^U+]5m;aa=\TRSn./O*k6gr?g/Q7+@d,UXa3iJM<9p&l=Oi?ZqEl.UqSPE/;Jd2:D[>1QCNmH4QT[.t'eaW5*"(eJlX)/>];fn+O_02[8@3W@;*)ipUYijl&WQBDag2-DM#C4#83]F0X?48YN%(L^81dSZWB3#8["tk>alrEIgLQo;<'Lo@HRMI]6+"1$_5m0i[b85MU;hQcJ+,jq<[&oqT*'Yj^>[qr43^S.4[$AhJtmk'q8Z*!42JS<[glsjXIiUn_Vfi7KJ!d)Qab&[ZsWEGkR<@!12%'te)>Y<!qZ)B$hhqp^#IOKY3Z<!*=1s@!lO[qS#eh$1Ut!q"J>!YpV,rVCX;OP;;_]*I6=PM+NrH$`/c=:I4&hE\Z1erpl9,MU%))fbMgXN=SgY^"QgScM/oerk_Cf<%Gf<Z6_jQ/~>endstream
2232endobj2232endobj
2233% 'R176': class PDFStream 2233% 'R176': class PDFStream
2234176 0 obj2234176 0 obj
2235% page stream2235% page stream
2236<< /Filter [ /ASCII85Decode2236<< /Filter [ /ASCII85Decode
2237 /FlateDecode ]2237 /FlateDecode ]
2238 /Length 727 >>2238 /Length 1164 >>
2239stream2239stream
2240Gb!#YgMYJ*&:KW#Ii)/e,q(O_?[/>2+]:S&oj_=Zp,I&-Hd1uUV16g9';LdY/lIcL-ba/)k3SMBB5Om:Yk:"p!%q2pHY%is5[&d,R3&/Fpll\l+3)CYNX[3=IG_E+32.7"oI:GTEmZS;YXk-h`lQRq`R5T#_BI26^l0CQW'Ube?QeX+k:g5$>7Lh_f+#0GWJ\/-Q)NEu@PWN,(=G,[_tRdt4NhhAKjjpLiBKa3oI7!IJJ-LB/?pfDPBZm)354Xj!$5t"%*ll1LRLd@'IcoGT7.>@Vt4gso^.A*(BW#b-%Qd7SKMFJb(3^s]S$Zl\9PZ:S2VI,M&iR6M5..AGc9+!^8,-!n/@IN=69Los66u;)R`$o"kg.#jo.7Dmcc;dW2Y/='50:uRR4oMFcG9\K2X2MD;O.jP$6d4Vt]uD;Z"\#88\f;,&sS_#g&iFOl1J-Mn.8ckseVZ'\<G/$he(P>r+N'G:ien$2#sjVQ6-%JOQtp5)MKbIL1`D=PeN]XH(B4'Zf^&1G(hKcY6RhQ@)$l/%-/A$-7E<qZ2B,)=;0HiVo]]gk.RI?BIf!Ur&0g([NkUgs`[R=hSepnJm5=BO.ho^!SmY2S2m7F<HOOn>P"7)ETS$S7V1RRDCbH.'Us92t]qQkBLSYpqbE!6Kb:MB%BrdEh*fR4&XCBP'0dWhF'6Z40Ih$3n*e.%6%'t3K\._5u4D%ol7`K8S*BF)N<&slD,A8~>endstream2240Gb!#\D/Yn7&H6Rhs'ZW+:/5rnbWEOWc/#4UjAp09QV.7_^g_3a]6&8Q2ZLM/@OFq"RMTD3[Z%J"B-*Y4H"OjH3PK@:9hU#;)#h7X_0-sH_=fDji[+LE:FDd4'754H(d[B_ei[,(\7Ret@jPhAA4a/*fnr<US]o?XE\j8Z62SKR'gZ*!"!=8kIT6>R_CVHB<(&2Sdr0Oqe%!(@7!c>Vr9"^P:Ct8p&DfW=iQWsP0+'deJ.Xu!Z(>q9R7MNJjdKj03%-?rhlJJ,_f1"H)i]f+$_e>?&OfbY-1Wkr5rcY=;W%aDV;U@!PuU,8L.Wl5P(GTCOmnY#/I5\<KAKKS"eLkg`DR7Ic'5LD0^I$nn.fl0!Xp[@<1-/Ym_.BgT&Is!8AY_2)'6\Fp9mS^ic1j<#A\ZZ'N.<Aa&d2G%5#A?>3n"LSs&Bd(1'09a9e&d<3gWC`/rD6hHQla%H^\F=tj`iF`o-S_`/Q=cP.u%^C\J75rgB.>D`ZWDaf*5?uSV2n\DP&XS2fIPagbD.BQ:r62tCY!u#a&`*trCifG0t7/0X+5=<I=_@Q&5RFt18/'6qI8oiLb8:3YgT:KV&`,kcfBIb;sJ$4ukhQ/\Fs%GQX/%0L'5s6,&)HJm0%Gi9K;c-7JCAJlpCmsIgd-P?"n-h!AC1O5N7ID$-<`5)4&]K<t)Gr"N61d5EXlm</&6_X?e_P>uF/.VYB0F9U;.lB_ZHHeC/d=-nS1O'+^1m?K!G3Au=b`FE\;-aXOi)kjb:XnPAL0=AUWb?2<0rac4Q"(qQgcB(rk!VCBAV,i6fC^=Od)lpf+\^.SZOo;mdL;#6]%'PgD0?$$8bBJNi2>,8@9BFkbZ$h[F\kP<H"gRUhOtT\!V+Yq*\.u%[fR9%9f,49F+C'oEI/*<phrIisOf_;nVQARQel>o=GZ_mXW#5I\F@HJ:?7Hd;A(^b4o7$d;nCP]'Z]3\DaA"\us[j@O*(qOdlR46j).Y.go^%lf()R7jT"06lQk932!$iU#HH/Z]l/`ilL:*bX3'\m(%CtiZ'#5*4Z@r#T&DR.!.BE5V"#NOsKO3FTW_!:*o!N4Z7_qg2fAl&bs1@)q*@e87E;b!OYQ3h&U+RYn>i;hQ'A-1SSYFTs;!)YCP@T^7<9QK"t'h`_0U=GRO)[7Dj6<*V6\5f)~>endstream
2241endobj2241endobj
2242% 'R177': class PDFStream 2242% 'R177': class PDFStream
2243177 0 obj2243177 0 obj
2244% page stream2244% page stream
2245<< /Filter [ /ASCII85Decode2245<< /Filter [ /ASCII85Decode
2246 /FlateDecode ]2246 /FlateDecode ]
2247 /Length 1059 >>2247 /Length 1051 >>
2248stream2248stream
2249Gasan>Ap#k'Rl+-s)9#_.BQLf2L"#Th2SjCG*OuP^.&;hN4XUsm7BA=^;n#o)qkWURUP]03EHOj004KH/\q6'(,lpUK7!hZn,g[LiQqGmiplSk:@H1/_u]Oo,YddPn.uuAde2]*!mj(WSo,.$!DOOT@h()aSfcui!dOrNbJ"cu-,78/hSG!Imbs(KP")G]rfY8N]mU"Y=30:9]9@;2dc]RQ($8#Ka*,=+heB>n]&hM#lAfXD$M?_PdtjU=ocq,K(QFkn(aLJ8i\Y#U\lEkW#Ud"C9&XXAk5#BjmDN;t<E"q[0LFuTOp).HP*te!%7jQVnpdA-BDtq-U4SY2/LW2dg$o8mXhK\@6D[:q%I5_OcmWCJa*s]Q-U*\EI.T][+"7kR8p6\ZH7dKn\*%!s'lpb2(tmHDC=G$m)I^9]FLFPt(DJ*ZArL=QI_eamm1l]VOb9?'!^?i>)_j!n$ksSP#r"ROUPtuK]W8IO=r">!lCcqoYL^?n)^s=N[mFT/KXG#t2rtrMeb2N\4FeC-Q!8Y*,kS`&EZc_ncnP(?/>OroqEpO;<cjX3G7k>l1C'B:0V\eEY^<[;A\h$-5K-#P>s47;*)L?1KF.6CkJF#6.khUk$L#tq)!SnX%0\\XGJsC1#`\KPo[4^nHpekTM6e>IJoHbB^?&&k<d_6g1(t\e#2j6QTq=@#Z!(Ed!;8-(ZI&M'&^IZ!,A\>[L`L&U0SfVQVCf$?.mu61\7:s0%aKX)s-#bi72td,EK`_Ajg>,iT\gKgqdp>gE6dSffT:d5/-n#nCiHMfLM&QioKKujK5f`fX)Q;)&o,f#4k2$:XQOc/MIE<Rg*&o6cW4&8T63=ZOq@dW`WfkdaHU[-5El3F[;1?\U+s/@Y6ClT@=2Al@Q5&@fi2(C()qKES(VNrXs6(h<[4Mtb[sq"dRp%-=T1q]8'nV#*f%;@\A>m,_k(AM/U+Q3@Kph@N`uuP!m5LR\%I7Qh+-6uPEfYAj(/jY?6"aJ.E69Z4,;CH&uJ+P6HFP8NKDVq#4>8X)6V%/_CZT7M\el1`][#Agr&6mGK:4N8H~>endstream2249Gasan>Ar7S'RgRSs)9#?+<=@JV!`R#ecouR%G@KC24u3uAh/uN8LO2Gn"D;iZD\ch(q(uEQZJugn=nrUh#mRU_W$:OAPfO[7R71=/USs"0-2c"kk&b]5oS,nbOQ(fN.6u[0@O66+94Q4ioqNS(spLe1$6k=)MBO\,u?L=[2]CE)Yji.n.'pIpE';L:XVk;i1mYSS*aE.^HhTF]K84<-2f^XkJG(]$.rS:06]me[->,BU:K<=cNjsn]P3JoeAa2"c%=0?]m=b#gB%pW(nk[VD#<Ys$/Y#[>oiRcJ-%Dkk^ns$M(s`R(ubuq=,HdS0S_H6kU4cnb30nROf_TqK>Hb)U3=oIg0V[CB-'*Nh>Z&Vke`1;A;_"IO<R*8%%r_to?aWD3`cR3A^_c70<LM>KiP%CH.<3?bbDF,HFfadWOuWG@-K1Zb3bj1KdduNI2;T,@+gB^iO_@;&Xi\-M`<.V%_u)NI5&6qb3GaBT=NPB@;V]Eo>(`c_%P%1U#4@8W-(<IR0We1\>m%5i(9;]?fXaQ6D/<1k!_sNnb$5?RpIM`SNhr8Kq/=jpR''SA_8q1b_kVlbb&C>*S&H1Ak,ghO(#p'd^_'"c3]F4G64"X"tP+(Y+ahjo8\(q=CI<*S6hX/9i";Y+DDE6724(1hY4\K^km!tB4d;?g^&9Z1%[8W];nui$\06+SZE5ac@VD8nHh)`)oPL/0UfoYF444CbRL:M#M_,[!CneoC&!<Ih2/T"ET8F#!QSCP:;a:h@/nImX5P@/G[s/S6Am6AR('nk<Y*N*N1!%\Y=@Kd2brC`P;T^6#rC*]L2>dcXfHH;T\;+he'D>ZRicc:4->X,3lVA45KT/_4[555qK6S)m:%cZ")eA,eT#tCO(((J)qd)NRgpB^-+hiF*3U#=3*$]rLWj@3.d85(;_3E8%O5Z@(Q[V3?ef&HPB"LFrI-h2#:Y9^cZf6q2Zh.l8@Q6`jkV<>:Qq&BkgO++`^-'5aZ7B@??7/^m3G@U[YL6(!S]n8cT8R#,A"A)P6CVe4K_p/R2GZXJ)MG$0>7MiF>OX~>endstream
2250endobj2250endobj
2251xref2251xref
22520 17822520 178
@@ -2370,72 +2370,72 @@
23700000044494 00000 n23700000044494 00000 n
23710000044648 00000 n23710000044648 00000 n
23720000045280 00000 n23720000045280 00000 n
23730000046611 00000 n23730000046601 00000 n
23740000047980 00000 n23740000047970 00000 n
23750000050352 00000 n23750000050342 00000 n
23760000052637 00000 n23760000052614 00000 n
23770000054973 00000 n23770000054936 00000 n
23780000057465 00000 n23780000057401 00000 n
23790000059951 00000 n23790000059842 00000 n
23800000062442 00000 n23800000062312 00000 n
23810000064606 00000 n23810000064483 00000 n
23820000067088 00000 n23820000066913 00000 n
23830000068843 00000 n23830000068677 00000 n
23840000070655 00000 n23840000070669 00000 n
23850000072771 00000 n23850000072785 00000 n
23860000074026 00000 n23860000074102 00000 n
23870000076740 00000 n23870000076816 00000 n
23880000078806 00000 n23880000078882 00000 n
23890000081192 00000 n23890000081268 00000 n
23900000083287 00000 n23900000083363 00000 n
23910000084769 00000 n23910000084845 00000 n
23920000085270 00000 n23920000085346 00000 n
23930000086527 00000 n23930000086603 00000 n
23940000088686 00000 n23940000088729 00000 n
23950000090927 00000 n23950000090985 00000 n
23960000092922 00000 n23960000093022 00000 n
23970000094351 00000 n23970000094529 00000 n
23980000096078 00000 n23980000096226 00000 n
23990000097874 00000 n23990000098067 00000 n
24000000100283 00000 n24000000100531 00000 n
24010000100946 00000 n24010000101271 00000 n
24020000102978 00000 n24020000103486 00000 n
24030000105100 00000 n24030000105666 00000 n
24040000106969 00000 n24040000107515 00000 n
24050000108914 00000 n24050000109371 00000 n
24060000111121 00000 n24060000111277 00000 n
24070000113273 00000 n24070000113558 00000 n
24080000115207 00000 n24080000115573 00000 n
24090000117769 00000 n24090000118204 00000 n
24100000119695 00000 n24100000120084 00000 n
24110000121592 00000 n24110000121879 00000 n
24120000123304 00000 n24120000123669 00000 n
24130000125301 00000 n24130000125390 00000 n
24140000127057 00000 n24140000127345 00000 n
24150000128839 00000 n24150000129012 00000 n
24160000130606 00000 n24160000130807 00000 n
24170000133048 00000 n24170000133104 00000 n
24180000135493 00000 n24180000135631 00000 n
24190000137615 00000 n24190000137580 00000 n
24200000140176 00000 n24200000139936 00000 n
24210000142418 00000 n24210000142453 00000 n
24220000144459 00000 n24220000144439 00000 n
24230000145988 00000 n24230000146353 00000 n
24240000147598 00000 n24240000148112 00000 n
24250000148918 00000 n24250000149444 00000 n
24260000150079 00000 n24260000150619 00000 n
24270000151241 00000 n24270000151744 00000 n
24280000152376 00000 n24280000152850 00000 n
24290000154331 00000 n24290000154642 00000 n
24300000155202 00000 n24300000155951 00000 n
2431trailer2431trailer
2432<< /ID 2432<< /ID
2433 % ReportLab generated PDF document -- digest (http://www.reportlab.com) 2433 % ReportLab generated PDF document -- digest (http://www.reportlab.com)
2434 [(\242\252\270\340f0b\216\324\353o\343\364\370\200\353) (\242\252\270\340f0b\216\324\353o\343\364\370\200\353)] 2434 [(c\0243\337\031,U\034\302\260}\304\003\260!\242) (c\0243\337\031,U\034\302\260}\304\003\260!\242)]
24352435
2436 /Info 71 0 R2436 /Info 71 0 R
2437 /Root 70 0 R2437 /Root 70 0 R
2438 /Size 178 >>2438 /Size 178 >>
2439startxref2439startxref
24401563782440157119
2441%%EOF2441%%EOF
24422442
=== modified file 'docs/userguide/app_demos.py'
--- docs/userguide/app_demos.py 2009-02-22 14:19:44 +0000
+++ docs/userguide/app_demos.py 2013-04-14 00:52:26 +0000
@@ -1,4 +1,4 @@
1#Copyright ReportLab Europe Ltd. 2000-20041#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/app_demos.py3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/app_demos.py
4from tools.docco.rl_doc_utils import *4from tools.docco.rl_doc_utils import *
55
=== modified file 'docs/userguide/ch1_intro.py'
--- docs/userguide/ch1_intro.py 2010-12-06 12:45:44 +0000
+++ docs/userguide/ch1_intro.py 2013-04-14 00:52:26 +0000
@@ -1,6 +1,6 @@
1#Copyright ReportLab Europe Ltd. 2000-20041#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3__version__ = '$Id: ch1_intro.py 3790 2010-09-29 14:20:28Z tim $'3__version__ = '$Id: ch1_intro.py 3960 2012-09-27 15:22:33Z guillaume $'
4from tools.docco.rl_doc_utils import *4from tools.docco.rl_doc_utils import *
5from reportlab.platypus.tableofcontents import TableOfContents5from reportlab.platypus.tableofcontents import TableOfContents
6from datetime import datetime6from datetime import datetime
@@ -181,6 +181,7 @@
181disc("""Many people have contributed to ReportLab. We would like to thank in particular 181disc("""Many people have contributed to ReportLab. We would like to thank in particular
182(in alphabetical order): 182(in alphabetical order):
183Albertas Agejevas, 183Albertas Agejevas,
184Alex Buck,
184Andre Reitz, 185Andre Reitz,
185Andrew Mercer, 186Andrew Mercer,
186Benjamin Dumke,187Benjamin Dumke,
@@ -189,13 +190,16 @@
189Chris Lee, 190Chris Lee,
190Christian Jacobs, 191Christian Jacobs,
191Dinu Gherman,192Dinu Gherman,
192Eric Johnson, 193Eric Johnson,
194Felix Labrecque,
193Gary Poster, 195Gary Poster,
194Germán M. Bravo,196Germán M. Bravo,
197Guillaume Francois,
195Hans Brand,198Hans Brand,
196Henning Vonbargen,199Henning Vonbargen,
197Hosam Aly,200Hosam Aly,
198Ian Stevens,201Ian Stevens,
202James Martin-Collar,
199Jeff Bauer,203Jeff Bauer,
200Jerome Alet,204Jerome Alet,
201Jerry Casiano,205Jerry Casiano,
@@ -210,6 +214,7 @@
210Moshe Wagner,214Moshe Wagner,
211Nate Silva,215Nate Silva,
212Paul McNett, 216Paul McNett,
217Peter Johnson,
213PJACock,218PJACock,
214Publio da Costa Melo, 219Publio da Costa Melo,
215Randolph Bentson,220Randolph Bentson,
@@ -240,16 +245,26 @@
240heading3("A note on available versions")245heading3("A note on available versions")
241disc("""Our website ^http://www.reportlab.com/^ will always have up-to-date246disc("""Our website ^http://www.reportlab.com/^ will always have up-to-date
242information on setups and installations. The latest version of the ReportLab library can be found at247information on setups and installations. The latest version of the ReportLab library can be found at
243^http://www.reportlab.com/software/opensource/rl-toolkit/download/^. Older versions can be found at ^http://www.reportlab.com/ftp/^.248^http://www.reportlab.com/software/opensource/rl-toolkit/download/^.
244 Each successive version is stored in both zip249Older versions can be found at ^http://www.reportlab.com/ftp/^.
250""")
251disc("""Each successive version is stored in both zip
245and tgz format, but the contents are identical apart from line endings.252and tgz format, but the contents are identical apart from line endings.
246Versions are numbered: $ReportLab_<major_version>_<minor_version>.zip$, 253Versions are numbered: $ReportLab_<major_version>_<minor_version>.zip$,
247$ReportLab_<major_version>_<minor_version>.tgz$ and so on. 254$ReportLab_<major_version>_<minor_version>.tgz$ and so on.
248The latest stable version is $reportlab2.5$ (.zip or .tgz), 255""")
256disc("""
257The latest stable version is $reportlab2.6$ (.zip or .tgz).
249Daily snapshots of the trunk are available as258Daily snapshots of the trunk are available as
250$reportlab-daily-unix.tar.gz$ or $reportlab-daily-win32.zip$.259$reportlab-daily-unix.tar.gz$ or $reportlab-daily-win32.zip$.
251 Finally, from version 2.4 onwards, there is also a Windows installer260""")
252available for Python versions 2.4 - 2.7, named $ReportLab-2.x.win32-py2.x.exe$261disc("""Finally, from version 2.4 onwards, there is also a Windows installer
262available for Python versions 2.5 - 2.7, named $ReportLab-2.x.win32-py2.x.exe$
263""")
264
265pencilnote()
266disc("""We plan to drop the support of Python 2.5 in our next release.
267We advise you to move to Python 2.6 or 2.7.
253""")268""")
254269
255heading3("Installation on Windows")270heading3("Installation on Windows")
@@ -257,8 +272,8 @@
257restartList()272restartList()
258273
259list("""First, install Python from $http://www.python.org/.$274list("""First, install Python from $http://www.python.org/.$
260Reportlab 2.x works with Python 2.4 upwards but we recommend to use275Reportlab 2.x works with Python 2.5 upwards but we recommend to use
261the latest stable version of Python 2.5 or 2.6. 276the latest stable version of Python 2.7.
262After installing, you should be able to run the277After installing, you should be able to run the
263'Python (command line)' option from the Start Menu.278'Python (command line)' option from the Start Menu.
264""")279""")
@@ -304,8 +319,10 @@
304319
305heading3("Installation instructions for Unix")320heading3("Installation instructions for Unix")
306disc("""321disc("""
307 322Many Linux distributions already include or can deliver a ReportLab distribution, although this may be a few months behind our own releases. On Ubuntu, simply use ^sudo apt-get install python-reportlab^. In addition, we support the Python packaging mechanisms so you can use ^easy_install reportlab^ in most Python environments.
308""")323""")
324disc("""
325If you want to install the latest version of our code, or to install your own reportlab to go with our commercial distribution, you can install from source as follows:""")
309326
310restartList()327restartList()
311list("""First, install Python. On a large number of Unix and Linux distributions, Python is already installed,328list("""First, install Python. On a large number of Unix and Linux distributions, Python is already installed,
@@ -397,8 +414,6 @@
397bullet("""allowtableBoundsErrors: set to 0 to force an error on very large Platypus table elements""")414bullet("""allowtableBoundsErrors: set to 0 to force an error on very large Platypus table elements""")
398bullet("""emptyTableAction: Controls behaviour for empty tables, can be 'error' (default), 'indicate' or 'ignore'.""")415bullet("""emptyTableAction: Controls behaviour for empty tables, can be 'error' (default), 'indicate' or 'ignore'.""")
399416
400
401
402heading2("Learning More About Python")417heading2("Learning More About Python")
403418
404disc("""419disc("""
@@ -440,7 +455,7 @@
440455
441bullet("""<b>Dive Into Python</b>.456bullet("""<b>Dive Into Python</b>.
442A free Python tutorial for experienced programmers.457A free Python tutorial for experienced programmers.
443$http://diveintopython.org/$458$http://www.diveintopython.net/$
444""")459""")
445460
446461
@@ -466,44 +481,49 @@
466target dates.481target dates.
467""")482""")
468483
469heading2("What's New in ReportLab 2.4")484heading2("What's New in ReportLab 2.6")
470disc("""Many new features have been added and numerous bugs have been fixed, a big485disc("""This is a minor release focusing mainly on improved documentation. There are a
471thanks goes to the community for their help in reporting bugs and providing patches. 486number of minor enhancements, and a larger number of previous-undocumented
472Thanks to everybody who has contributed to the open-source toolkit in the run-up to the 2.4 release, 487enhancements which we have documented better.""")
488
489disc("""A big thanks goes to the community for their help in reporting bugs and providing patches.
490Thanks to everybody who has contributed to the open-source toolkit in the run-up to the 2.6 release,
473whether by reporting bugs, sending patches, or contributing to the reportlab-users mailing list. 491whether by reporting bugs, sending patches, or contributing to the reportlab-users mailing list.
474Thanks especially to the following people: PJACock, Hans Brand, Ian Stevens, Yoann Roman, Hosam Aly 492Thanks especially to the following people: Alex Buck, Felix Labrecque,
475Randolph Bentson, Volker Haas, Simon King, Henning Vonbargen, Michael Egorov, Mike Folwell and 493Peter Johnson, James Martin-Collar and Guillaume Francois.
476Roberto Alsina. 494This page documents what has changed since version 2.5.""")
477This page documents what has changed since version 2.3.""")495
478496disc('Reportlab 2.6 is installable with easy_install. You must have installed a compatible C compiler and the dependencies such as Freetype and PIL.')
479disc('Reportlab 2.4 is installable with easy_install. You must have installed a compatible C compiler and the dependencies such as Freetype and PIL.')497
480498heading4('General changes')
481heading4('PDF')499bullet("""Manuals have been reformatted with more pleasing code snippets and tables of
482bullet("""Canvas automatic cropmarks.""")500contents, and reviewed and expanded.""")
483bullet("""RGB alpha colours - colours can now be transparent with an alpha value.""")501
484bullet("""CMYK overPrint - physical colour mix in the printer - similar to RGB alpha but502heading4('Flowing documents (Platypus)')
485 used in professional printing.""")503bullet("""Added support for HTML-style list objects.""")
486bullet("""Colours module has a fade function that returns a list of different shades made504bullet("""Added flexible mechanism for drawing bullets.""")
487 up of one base colour.""")505bullet("""Allowed XPreformatted objects to use Asian line wrapping.""")
488bullet("""Unicode font file names are now accepted.""")506bullet("""Added an 'autoNextPageTemplate' attribute to PageTemplates. For example you
489bullet("""Lots of improvements and verbosity to error messages and the way they are handled. 507can now set up a 'chapter first page template' which will always be followed
490Font size can now be specified in pixels.""")508by a 'continuation template' on the next page break, saving the programmer from
491509having to issue control flow commands in the story.""")
492heading4('Platypus')510bullet("""Added a TopPadder flowable, which will 'wrap' another Flowable and move it
493bullet("""Added support for heading styles h4-h6.""")511to the bottom of the current page.""")
494bullet("""Improved support for onDraw and SimpleIndex.""")512bullet("""More helpful error messages when large tables cannot be rendered.""")
495bullet("""Add support for index tableStyle.""")513bullet("""Documentation for images within text (test_032_images).""")
496bullet("""Added an alphabetic grouping indexing class.""")514bullet("""Trailing dots for use on contents pages.""")
497bullet("""Added support for multi-level and alphabetical indexes.""")515
498bullet("""Added support for an unlimited number of TOC levels with default styles.""")516heading4('Charts and graphics')
499bullet("""Index entries can now be clickable.""")517bullet("""Support for UPCA bar codes.""")
500518bullet("""We now have a semi-intelligent system for labelling pie charts with
501heading4('Graphics')519callout lines. Thanks to James Martin-Collar, a maths student at Warwick
502bullet("""Chart axes values can be reversible.""")520University, who did this as his summer internship.""")
503bullet("""Labels on chart axes can now be drawn above or below the axes (hi or low).""")521bullet("""Axes - added startOffset and endOffset properties; allowed for axis
504bullet("""A per swatch callout is now allowed in the legend.""")522background annotations.""")
505bullet("""A new anchoring mode for string 'numeric' that align numerical strings by their decimal place.""")523bullet("""Bar charts - allow more control of z Index (i.e. drawing order of axes and
506bullet("""Drawing has a resized method now to change the size dynamically.""")524lines)""")
525bullet("""Pie charts - fixed bugs in 3d appearance.""")
526bullet("""SVG output back end has seen some bugs fixed and now outputs resizeable SVG.""")
507527
508# Noteworthy bug fixes Section #######################528# Noteworthy bug fixes Section #######################
509#heading3("Noteworthy bug fixes")529#heading3("Noteworthy bug fixes")
510530
=== modified file 'docs/userguide/ch2_graphics.py'
--- docs/userguide/ch2_graphics.py 2010-12-06 12:45:44 +0000
+++ docs/userguide/ch2_graphics.py 2013-04-14 00:52:26 +0000
@@ -1,4 +1,4 @@
1#Copyright ReportLab Europe Ltd. 2000-20041#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch2_graphics.py3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch2_graphics.py
4from tools.docco.rl_doc_utils import *4from tools.docco.rl_doc_utils import *
@@ -1227,28 +1227,27 @@
1227heading2("Further Reading: The ReportLab Graphics Library")1227heading2("Further Reading: The ReportLab Graphics Library")
12281228
1229disc("""1229disc("""
1230So far the graphics we have seen was created on a fairly low level.1230So far the graphics we have seen were created on a fairly low level.
1231It should be noted, though, that there is another way of creating1231It should be noted, though, that there is another way of creating
1232much more sophisticated graphics using the emerging dedicated1232much more sophisticated graphics using the dedicated
1233high-level <i>ReportLab Graphics Library</i>.1233high-level <i>ReportLab Graphics Library</i>.
1234""")1234""")
12351235
1236disc("""1236disc("""
1237It can be used to produce high-quality, platform-independant,1237It can be used to produce high-quality, platform-independant,
1238reusable graphics for different output formats (vector and bitmap)1238reusable graphics for different output formats (vector and bitmap)
1239like PDF, EPS and soon others like SVG.1239like PDF, EPS, SVG, JPG and PNG.
1240""")1240""")
12411241
1242disc("""1242disc("""
1243A thorough description of its philsophy and features is beyond the1243A more thorough description of its philsophy and features is
1244scope of this general user guide and the reader is recommended to1244now covered in Chapter 11 of this document, <i>Graphics</i>, which
1245continue with the <i>"ReportLab Graphics Guide"</i>.1245contains information about the existing components and
1246There she will find information about the existing components and
1247how to create customized ones.1246how to create customized ones.
1248""")1247""")
12491248
1250disc("""1249disc("""
1251Also, the graphics guide contains a presentation of an emerging1250Chapter 11 also contains details of the ReportLab
1252charting package and its components (labels, axes, legends and1251charting package and its components (labels, axes, legends and
1253different types of charts like bar, line and pie charts) that1252different types of charts like bar, line and pie charts) that
1254builds directly on the graphics library.1253builds directly on the graphics library.
12551254
=== modified file 'docs/userguide/ch2a_fonts.py'
--- docs/userguide/ch2a_fonts.py 2008-10-19 23:16:31 +0000
+++ docs/userguide/ch2a_fonts.py 2013-04-14 00:52:26 +0000
@@ -1,4 +1,4 @@
1#Copyright ReportLab Europe Ltd. 2000-20041#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch2a_fonts.py3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch2a_fonts.py
4from tools.docco.rl_doc_utils import *4from tools.docco.rl_doc_utils import *
55
=== modified file 'docs/userguide/ch3_pdffeatures.py'
--- docs/userguide/ch3_pdffeatures.py 2009-02-22 14:19:44 +0000
+++ docs/userguide/ch3_pdffeatures.py 2013-04-14 00:52:26 +0000
@@ -1,4 +1,4 @@
1#Copyright ReportLab Europe Ltd. 2000-20041#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch3_pdffeatures.py3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch3_pdffeatures.py
4from tools.docco.rl_doc_utils import *4from tools.docco.rl_doc_utils import *
55
=== modified file 'docs/userguide/ch4_platypus_concepts.py'
--- docs/userguide/ch4_platypus_concepts.py 2009-02-22 14:19:44 +0000
+++ docs/userguide/ch4_platypus_concepts.py 2013-04-14 00:52:26 +0000
@@ -1,4 +1,4 @@
1#Copyright ReportLab Europe Ltd. 2000-20041#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch4_platypus_concepts.py3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch4_platypus_concepts.py
4from tools.docco.rl_doc_utils import *4from tools.docco.rl_doc_utils import *
55
=== modified file 'docs/userguide/ch5_paragraphs.py'
--- docs/userguide/ch5_paragraphs.py 2010-12-06 12:45:44 +0000
+++ docs/userguide/ch5_paragraphs.py 2013-04-14 00:52:26 +0000
@@ -1,4 +1,4 @@
1#Copyright ReportLab Europe Ltd. 2000-20041#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch5_paragraphs.py3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch5_paragraphs.py
4from tools.docco.rl_doc_utils import *4from tools.docco.rl_doc_utils import *
55
=== modified file 'docs/userguide/ch6_tables.py'
--- docs/userguide/ch6_tables.py 2010-12-06 12:45:44 +0000
+++ docs/userguide/ch6_tables.py 2013-04-14 00:52:26 +0000
@@ -1,8 +1,8 @@
1#Copyright ReportLab Europe Ltd. 2000-20041#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch6_tables.py3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch6_tables.py
4from tools.docco.rl_doc_utils import *4from tools.docco.rl_doc_utils import *
5from reportlab.platypus import Image5from reportlab.platypus import Image,ListFlowable, ListItem
6import reportlab6import reportlab
77
8heading1("Tables and TableStyles")8heading1("Tables and TableStyles")
@@ -397,16 +397,41 @@
397""")397""")
398398
399heading1("""Other Useful $Flowables$""")399heading1("""Other Useful $Flowables$""")
400heading2("""$Preformatted(text, style, bulletText = None, dedent=0)$""")400heading2("""$Preformatted(text, style, bulletText=None, dedent=0, maxLineLength=None, splitChars=None, newLineChars=None)$""")
401disc("""401disc("""
402Creates a preformatted paragraph which does no wrapping, line splitting or other manipulations.402Creates a preformatted paragraph which does no wrapping, line splitting or other manipulations.
403No $XML$ style tags are taken account of in the text.403No $XML$ style tags are taken account of in the text.
404If dedent is non zero $dedent$ common leading404If dedent is non zero $dedent$ common leading
405spaces will be removed from the front of each line.405spaces will be removed from the front of each line.
406""")406""")
407heading2("""$XPreformatted(text, style, bulletText = None, dedent=0, frags=None)$""")407heading3("Defining a maximum line length")
408disc("""408disc("""
409This is a non rearranging form of the $Paragraph$ class; $XML$ tags are allowed in409You can use the property $maxLineLength$ to define a maximum line length. If a line length exceeds this maximum value, the line will be automatically splitted.
410""")
411disc("""
412The line will be split on any single character defined in $splitChars$. If no value is provided for this property, the line will be split on any of the following standard characters: space, colon, full stop, semi-colon, coma, hyphen, forward slash, back slash, left parenthesis, left square bracket and left curly brace
413""")
414disc("""
415Characters can be automatically inserted at the beginning of each line that has been created. You can set the property $newLineChars$ to the characters you want to use.
416""")
417EmbeddedCode("""
418from reportlab.lib.styles import getSampleStyleSheet
419stylesheet=getSampleStyleSheet()
420normalStyle = stylesheet['Code']
421text='''
422class XPreformatted(Paragraph):
423 def __init__(self, text, style, bulletText = None, frags=None, caseSensitive=1):
424 self.caseSensitive = caseSensitive
425 if maximumLineLength and text:
426 text = self.stopLine(text, maximumLineLength, splitCharacters)
427 cleaner = lambda text, dedent=dedent: string.join(_dedenter(text or '',dedent),'')
428 self._setup(text, style, bulletText, frags, cleaner)
429'''
430t=Preformatted(text,normalStyle,maxLineLength=60, newLineChars='> ')
431""")
432heading2("""$XPreformatted(text, style, bulletText=None, dedent=0, frags=None)$""")
433disc("""
434This is a non rearranging form of the $Paragraph$ class; XML tags are allowed in
410$text$ and have the same meanings as for the $Paragraph$ class.435$text$ and have the same meanings as for the $Paragraph$ class.
411As for $Preformatted$, if dedent is non zero $dedent$ common leading436As for $Preformatted$, if dedent is non zero $dedent$ common leading
412spaces will be removed from the front of each line.437spaces will be removed from the front of each line.
@@ -414,7 +439,7 @@
414EmbeddedCode("""439EmbeddedCode("""
415from reportlab.lib.styles import getSampleStyleSheet440from reportlab.lib.styles import getSampleStyleSheet
416stylesheet=getSampleStyleSheet()441stylesheet=getSampleStyleSheet()
417normalStyle = stylesheet['Normal']442normalStyle = stylesheet['Code']
418text='''443text='''
419444
420 This is a non rearranging form of the <b>Paragraph</b> class;445 This is a non rearranging form of the <b>Paragraph</b> class;
@@ -429,6 +454,7 @@
429'''454'''
430t=XPreformatted(text,normalStyle,dedent=3)455t=XPreformatted(text,normalStyle,dedent=3)
431""")456""")
457
432heading2("""$Image(filename, width=None, height=None)$""")458heading2("""$Image(filename, width=None, height=None)$""")
433disc("""Create a flowable which will contain the image defined by the data in file $filename$.459disc("""Create a flowable which will contain the image defined by the data in file $filename$.
434The default <b>PDF</b> image type <i>jpeg</i> is supported and if the <b>PIL</b> extension to <b>Python</b>460The default <b>PDF</b> image type <i>jpeg</i> is supported and if the <b>PIL</b> extension to <b>Python</b>
@@ -437,7 +463,7 @@
437not specified (or specified as $None$) then the corresponding pixel dimension of the image is assumed463not specified (or specified as $None$) then the corresponding pixel dimension of the image is assumed
438to be in <i>points</i> and used.464to be in <i>points</i> and used.
439""")465""")
440I=os.path.join(os.path.dirname(reportlab.__file__),'docs','images','lj8100.jpg')466I="../images/lj8100.jpg"
441eg("""467eg("""
442Image("lj8100.jpg")468Image("lj8100.jpg")
443""",after=0.1)469""",after=0.1)
@@ -655,3 +681,43 @@
655disc("""681disc("""
656This indexes the terms "comma (,)", "," and "...".682This indexes the terms "comma (,)", "," and "...".
657""")683""")
684
685heading2("""$ListFlowable(),ListItem()$""")
686disc("""
687Use these classes to make ordered and unordered lists. Lists can be nested.
688""")
689
690disc("""
691$ListFlowable()$ will create an ordered list, which can contain any flowable. The class has a number of parameters to change font, colour, size, style and position of list numbers, or of bullets in unordered lists. The type of numbering can also be set to use lower or upper case letters ('A,B,C' etc.) or Roman numerals (capitals or lowercase) using the bulletType property. To change the list to an unordered type, set bulletType='bullet'.
692""")
693
694disc("""
695Items within a $ListFlowable()$ list can be changed from their default appearance by wrapping them in a $ListItem()$ class and setting its properties.
696""")
697
698disc("""
699The following will create an ordered list, and set the third item to an unordered sublist.
700""")
701
702EmbeddedCode("""
703from reportlab.platypus import ListFlowable, ListItem
704from reportlab.lib.styles import getSampleStyleSheet
705styles = getSampleStyleSheet()
706style = styles["Normal"]
707t = ListFlowable(
708[
709Paragraph("Item no.1", style),
710ListItem(Paragraph("Item no. 2", style),bulletColor="green",value=7),
711ListFlowable(
712 [
713 Paragraph("sublist item 1", style),
714 ListItem(Paragraph('sublist item 2', style),bulletColor='red',value='square')
715 ],
716 bulletType='bullet',
717 start='square',
718 ),
719Paragraph("Item no.4", style),
720],
721bulletType='i'
722)
723 """)
658724
=== modified file 'docs/userguide/ch7_custom.py'
--- docs/userguide/ch7_custom.py 2008-10-19 23:16:31 +0000
+++ docs/userguide/ch7_custom.py 2013-04-14 00:52:26 +0000
@@ -1,4 +1,4 @@
1#Copyright ReportLab Europe Ltd. 2000-20041#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch7_custom.py3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch7_custom.py
4from tools.docco.rl_doc_utils import *4from tools.docco.rl_doc_utils import *
55
=== modified file 'docs/userguide/genuserguide.py'
--- docs/userguide/genuserguide.py 2009-02-22 14:19:44 +0000
+++ docs/userguide/genuserguide.py 2013-04-14 00:52:26 +0000
@@ -1,8 +1,8 @@
1#!/bin/env python1#!/bin/env python
2#Copyright ReportLab Europe Ltd. 2000-20042#Copyright ReportLab Europe Ltd. 2000-2012
3#see license.txt for license details3#see license.txt for license details
4#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/genuserguide.py4#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/genuserguide.py
5__version__=''' $Id: genuserguide.py 3376 2009-01-19 12:05:41Z jonas $ '''5__version__=''' $Id: genuserguide.py 3959 2012-09-27 14:39:39Z robin $ '''
6__doc__ = """6__doc__ = """
7This module contains the script for building the user guide.7This module contains the script for building the user guide.
8"""8"""
99
=== modified file 'docs/userguide/graph_charts.py'
--- docs/userguide/graph_charts.py 2010-02-16 23:32:55 +0000
+++ docs/userguide/graph_charts.py 2013-04-14 00:52:26 +0000
@@ -1,6 +1,6 @@
1#Copyright ReportLab Europe Ltd. 2000-20081#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3__version__=''' $Id: graph_charts.py 3563 2009-10-01 10:52:36Z damian $ '''3__version__=''' $Id: graph_charts.py 3959 2012-09-27 14:39:39Z robin $ '''
4from tools.docco.rl_doc_utils import *4from tools.docco.rl_doc_utils import *
5from reportlab.graphics.shapes import *5from reportlab.graphics.shapes import *
66
@@ -133,7 +133,7 @@
133 properties.""")133 properties.""")
134134
135135
136heading3("Labels")136heading2("Labels")
137137
138disc("""138disc("""
139A label is a string of text attached to some chart element.139A label is a string of text attached to some chart element.
@@ -246,7 +246,7 @@
246246
247247
248248
249heading3("Axes")249heading2("Axes")
250250
251disc("""251disc("""
252We identify two basic kinds of axes - <i>Value</i> and <i>Category</i>252We identify two basic kinds of axes - <i>Value</i> and <i>Category</i>
@@ -576,7 +576,7 @@
576caption("""Table <seq template="%(Chapter)s-%(Table+)s"/> - Axes joining properties""")576caption("""Table <seq template="%(Chapter)s-%(Table+)s"/> - Axes joining properties""")
577577
578578
579heading3("Bar Charts")579heading2("Bar Charts")
580580
581disc("""581disc("""
582This describes our current $VerticalBarChart$ class, which uses the582This describes our current $VerticalBarChart$ class, which uses the
@@ -687,9 +687,6 @@
687 ["fillColor", """Defaults to None. This will fill the plot rectangle with687 ["fillColor", """Defaults to None. This will fill the plot rectangle with
688a solid color. (Note that we could implement dashArray etc.688a solid color. (Note that we could implement dashArray etc.
689as for any other solid shape)"""],689as for any other solid shape)"""],
690 ["barLabelFormat", """This is a format string or function used for displaying
691labels above each bar. They are positioned automatically
692above the bar for positive values and below for negative ones."""],
693 ["useAbsolute", """Defaults to 0. If 1, the three properties below are690 ["useAbsolute", """Defaults to 0. If 1, the three properties below are
694absolute values in points (which means you can make a chart691absolute values in points (which means you can make a chart
695where the bars stick out from the plot rectangle); if 0,692where the bars stick out from the plot rectangle); if 0,
@@ -704,8 +701,9 @@
704group. If you wanted a little gap between green and red bars in701group. If you wanted a little gap between green and red bars in
705the example above, you would make this non-zero."""],702the example above, you would make this non-zero."""],
706 ["barLabelFormat", """Defaults to None. As with the YValueAxis, if you supply703 ["barLabelFormat", """Defaults to None. As with the YValueAxis, if you supply
707a function or format string then labels will be drawn next704a function or format string then labels will be drawn next to each bar
708to each bar showing the numeric value."""],705showing the numeric value. They are positioned automatically
706above the bar for positive values and below for negative ones."""],
709 ["barLabels", """A collection of labels used to format all bar labels. Since707 ["barLabels", """A collection of labels used to format all bar labels. Since
710this is a two-dimensional array, you may explicitly format the708this is a two-dimensional array, you may explicitly format the
711third label of the second series using this syntax:709third label of the second series using this syntax:
@@ -865,7 +863,7 @@
865##title, subTitle Not implemented yet. These would be label-like objects whose text could be set directly and which would appear in sensible locations. For now, you can just place extra strings on the drawing.863##title, subTitle Not implemented yet. These would be label-like objects whose text could be set directly and which would appear in sensible locations. For now, you can just place extra strings on the drawing.
866864
867865
868heading3("Line Charts")866heading2("Line Charts")
869867
870disc("""868disc("""
871We consider "Line Charts" to be essentially the same as869We consider "Line Charts" to be essentially the same as
@@ -943,10 +941,42 @@
943941
944942
945disc("")943disc("")
946todo("Add properties table.")944
947945data=[["Property","Meaning"],
948946 ["data", "Data to be plotted, list of (lists of) numbers."],
949heading3("Line Plots")947 ["x, y, width, height", """Bounding box of the line chart.
948Note that x and y do NOT specify the centre but the bottom left corner"""],
949 ["valueAxis", """The value axis, which may be formatted as described previously."""],
950 ["categoryAxis", """The category axis, which may be formatted as described previously."""],
951 ["strokeColor", """Defaults to None. This will draw a border around the plot rectangle,
952which may be useful in debugging. Axes will overwrite this."""],
953 ["fillColor", """Defaults to None. This will fill the plot rectangle with a solid color."""],
954 ["lines.strokeColor", """Color of the line."""],
955 ["lines.strokeWidth", """Width of the line."""],
956 ["lineLabels", """A collection of labels used to format all line labels. Since
957this is a two-dimensional array, you may explicitly format the
958third label of the second line using this syntax:
959 chart.lineLabels[(1,2)].fontSize = 12"""],
960 ["lineLabelFormat", """Defaults to None. As with the YValueAxis, if you supply
961a function or format string then labels will be drawn next
962to each line showing the numeric value. You can also set it
963to 'values' to display the values explicity defined in lineLabelArray."""],
964 ["lineLabelArray", """Explicit array of line label values, must match size of data if present.
965These labels values will be displayed only if the property
966lineLabelFormat above is set to 'values'."""]]
967t=Table(data, colWidths=(100,330))
968t.setStyle(TableStyle([
969 ('FONT',(0,0),(-1,0),'Times-Bold',10,12),
970 ('FONT',(0,1),(0,-1),'Courier',8,8),
971 ('FONT',(1,1),(1,-1),'Times-Roman',10,12),
972 ('VALIGN',(0,0),(-1,-1),'MIDDLE'),
973 ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),
974 ('BOX', (0,0), (-1,-1), 0.25, colors.black),
975 ]))
976getStory().append(t)
977caption("""Table <seq template="%(Chapter)s-%(Table+)s"/> - HorizontalLineChart properties""")
978
979heading2("Line Plots")
950980
951disc("""981disc("""
952Below we show a more complex example of a Line Plot that982Below we show a more complex example of a Line Plot that
@@ -1024,22 +1054,56 @@
10241054
10251055
1026disc("")1056disc("")
1027todo("Add properties table.")1057
10281058data=[["Property","Meaning"],
10291059 ["data", "Data to be plotted, list of (lists of) numbers."],
10301060 ["x, y, width, height", """Bounding box of the line chart.
1031heading3("Pie Charts")1061Note that x and y do NOT specify the centre but the bottom left corner"""],
1062 ["xValueAxis", """The vertical value axis, which may be formatted as described previously."""],
1063 ["yValueAxis", """The horizontal value axis, which may be formatted as described previously."""],
1064 ["strokeColor", """Defaults to None. This will draw a border around the plot rectangle,
1065which may be useful in debugging. Axes will overwrite this."""],
1066 ["strokeWidth", """Defaults to None. Width of the border around the plot rectangle."""],
1067 ["fillColor", """Defaults to None. This will fill the plot rectangle with a solid color."""],
1068 ["lines.strokeColor", """Color of the line."""],
1069 ["lines.strokeWidth", """Width of the line."""],
1070 ["lines.symbol", """Marker used for each point.
1071You can create a new marker using the function makeMarker().
1072For example to use a circle, the function call would be makeMarker('Circle')"""],
1073 ["lineLabels", """A collection of labels used to format all line labels. Since
1074this is a two-dimensional array, you may explicitly format the
1075third label of the second line using this syntax:
1076 chart.lineLabels[(1,2)].fontSize = 12"""],
1077 ["lineLabelFormat", """Defaults to None. As with the YValueAxis, if you supply
1078a function or format string then labels will be drawn next
1079to each line showing the numeric value. You can also set it
1080to 'values' to display the values explicity defined in lineLabelArray."""],
1081 ["lineLabelArray", """Explicit array of line label values, must match size of data if present.
1082These labels values will be displayed only if the property
1083lineLabelFormat above is set to 'values'."""]]
1084t=Table(data, colWidths=(100,330))
1085t.setStyle(TableStyle([
1086 ('FONT',(0,0),(-1,0),'Times-Bold',10,12),
1087 ('FONT',(0,1),(0,-1),'Courier',8,8),
1088 ('FONT',(1,1),(1,-1),'Times-Roman',10,12),
1089 ('VALIGN',(0,0),(-1,-1),'MIDDLE'),
1090 ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),
1091 ('BOX', (0,0), (-1,-1), 0.25, colors.black),
1092 ]))
1093getStory().append(t)
1094caption("""Table <seq template="%(Chapter)s-%(Table+)s"/> - LinePlot properties""")
1095
1096
1097
1098
1099heading2("Pie Charts")
10321100
1033disc("""1101disc("""
1034We've already seen a pie chart example above.1102As usual, we will start with an example:
1035This is provisional but seems to do most things.
1036At the very least we need to change the name.
1037For completeness we will cover it here.
1038""")1103""")
10391104
1040eg("""1105eg("""
1041from reportlab.graphics.charts.piecharts import Pie1106from reportlab.graphics.charts.piecharts import Pie
1042
1043d = Drawing(200, 100)1107d = Drawing(200, 100)
10441108
1045pc = Pie()1109pc = Pie()
@@ -1056,19 +1120,18 @@
1056pc.slices[3].strokeDashArray = [2,2]1120pc.slices[3].strokeDashArray = [2,2]
1057pc.slices[3].labelRadius = 1.751121pc.slices[3].labelRadius = 1.75
1058pc.slices[3].fontColor = colors.red1122pc.slices[3].fontColor = colors.red
1059
1060d.add(pc)1123d.add(pc)
1061""")1124""")
10621125
1063from reportlab.graphics.charts.piecharts import Pie1126from reportlab.graphics.charts.piecharts import Pie
10641127
1065d = Drawing(200, 100)1128d = Drawing(400, 200)
10661129
1067pc = Pie()1130pc = Pie()
1068pc.x = 651131pc.x = 125
1069pc.y = 151132pc.y = 25
1070pc.width = 701133pc.width = 150
1071pc.height = 701134pc.height = 150
1072pc.data = [10,20,30,40,50,60]1135pc.data = [10,20,30,40,50,60]
1073pc.labels = ['a','b','c','d','e','f']1136pc.labels = ['a','b','c','d','e','f']
10741137
@@ -1076,7 +1139,7 @@
1076pc.slices[3].popout = 101139pc.slices[3].popout = 10
1077pc.slices[3].strokeWidth = 21140pc.slices[3].strokeWidth = 2
1078pc.slices[3].strokeDashArray = [2,2]1141pc.slices[3].strokeDashArray = [2,2]
1079pc.slices[3].labelRadius = 1.751142pc.slices[3].labelRadius = 1.25
1080pc.slices[3].fontColor = colors.red1143pc.slices[3].fontColor = colors.red
10811144
1082d.add(pc)1145d.add(pc)
@@ -1087,36 +1150,154 @@
1087Properties are covered below.1150Properties are covered below.
1088The pie has a 'wedges' collection and we document wedge properties1151The pie has a 'wedges' collection and we document wedge properties
1089in the same table.1152in the same table.
1090This was invented before we finished the $Label$ class and will1153""")
1091probably be reworked to use such labels shortly.1154
1092""")1155disc("")
10931156
1094disc("")1157data=[["Property", "Meaning"],
1095todo("Add properties table.")1158 ["data", "A list or tuple of numbers"],
10961159 ["x, y, width, height", """Bounding box of the pie.
1097##Property Value1160Note that x and y do NOT specify the centre but the bottom left
1098##data a list or tuple of numbers1161corner, and that width and height do not have to be equal;
1099##x, y, width, height Bounding box of the pie. Note that x and y do NOT specify the centre but the bottom left corner, and that width and height do not have to be equal; pies may be elliptical and wedges will be drawn correctly.1162pies may be elliptical and wedges will be drawn correctly."""],
1100##labels None, or a list of strings. Make it None if you don't want labels around the edge of the pie. Since it is impossible to know the size of slices, we generally discourage placing labels in or around pies; it is much better to put them in a legend alongside.1163 ["labels", """None, or a list of strings.
1101##startAngle Where is the start angle of the first pie slice? The default is '90' which is twelve o'clock.1164Make it None if you don't want labels around the edge of the pie.
1102##direction Which direction do slices progress in? The default is 'clockwise'.1165Since it is impossible to know the size of slices, we generally
1103##wedges Collection of wedges. This lets you customise each wedge, or individual ones. See below1166discourage placing labels in or around pies; it is much better
1104##wedges.strokeWidth Border width for wedge1167to put them in a legend alongside."""],
1105##wedges.strokeColor Border color1168 ["startAngle", """Where is the start angle of the first pie slice?
1106##wedges.strokeDashArray Solid or dashed line configuration for1169The default is '90' which is twelve o'clock."""],
1107##wedges.popout How far out should the slice(s) stick from the centre of1170 ["direction", """Which direction do slices progress in?
1108##the pie? default is zero.1171The default is 'clockwise'."""],
1109##wedges.fontName1172 ["sideLabels", """This creates a chart with the labels in two columns,
1110##wedges.fontSize1173one on either side."""],
1111##wedges.fontColor Used for text labels1174 ["sideLabelsOffset", """This is a fraction of the width of the pie that defines the horizontal
1112##wedges.labelRadius This controls the anchor point for a text label. It1175distance between the pie and the columns of labels."""],
1113##is a fraction of the radius; 0.7 will place the text inside the pie,1176 ["simpleLabels", """Default is 1. Set to 0 to enable the use of customizable labels
1114##1.2 will place it slightly outside. (note that if we add labels, we1177and of properties prefixed by label_ in the collection slices."""],
1115##will keep this to specify their anchor point)1178 ["wedges", """Collection of wedges.
1116##1179This lets you customise each wedge, or individual ones. See below"""],
11171180 ["wedges.strokeWidth", "Border width for wedge"],
11181181 ["wedges.strokeColor", "Border color"],
1119heading3("Legends")1182 ["wedges.strokeDashArray", "Solid or dashed line configuration"],
1183 ["wedges.popout", """How far out should the slice(s) stick from the centre of the pie?
1184Default is zero."""],
1185 ["wedges.fontName", "Name of the label font"],
1186 ["wedges.fontSize", "Size of the label font"],
1187 ["wedges.fontColor", "Color of the label text"],
1188 ["wedges.labelRadius", """This controls the anchor point for a text label.
1189It is a fraction of the radius; 0.7 will place the text inside the
1190pie, 1.2 will place it slightly outside. (note that if we add labels,
1191we will keep this to specify their anchor point)"""]]
1192t=Table(data, colWidths=(130,300))
1193t.setStyle(TableStyle([
1194 ('FONT',(0,0),(-1,0),'Times-Bold',10,12),
1195 ('FONT',(0,1),(0,-1),'Courier',8,8),
1196 ('FONT',(1,1),(1,-1),'Times-Roman',10,12),
1197 ('VALIGN',(0,0),(-1,-1),'MIDDLE'),
1198 ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),
1199 ('BOX', (0,0), (-1,-1), 0.25, colors.black),
1200 ]))
1201getStory().append(t)
1202caption("""Table <seq template="%(Chapter)s-%(Table+)s"/> - Pie properties""")
1203
1204heading3("Customizing Labels")
1205
1206disc("""
1207Each slide label can be customized individually by changing
1208the properties prefixed by $label_$ in the collection $wedges$.
1209For example $pc.slices[2].label_angle = 10$ changes the angle
1210of the third label.
1211""")
1212
1213disc("""
1214Before being able to use these customization properties, you need
1215to disable simple labels with: $pc.simplesLabels = 0$
1216""")
1217
1218disc("")
1219
1220data=[["Property", "Meaning"],
1221 ["label_dx", """X Offset of the label"""],
1222 ["label_dy", """Y Offset of the label"""],
1223 ["label_angle", """Angle of the label, default (0) is horizontal, 90 is vertical,
1224180 is upside down"""],
1225 ["label_boxAnchor", """Anchoring point of the label"""],
1226 ["label_boxStrokeColor", """Border color for the label box"""],
1227 ["label_boxStrokeWidth", """Border width for the label box"""],
1228 ["label_boxFillColor", """Filling color of the label box"""],
1229 ["label_strokeColor", """Border color for the label text"""],
1230 ["label_strokeWidth", """Border width for the label text"""],
1231 ["label_text", """Text of the label"""],
1232 ["label_width", """Width of the label"""],
1233 ["label_maxWidth", """Maximum width the label can grow to"""],
1234 ["label_height", """Height of the label"""],
1235 ["label_textAnchor", """Maximum height the label can grow to"""],
1236 ["label_visible", """True if the label is to be drawn"""],
1237 ["label_topPadding", """Padding at top of box"""],
1238 ["label_leftPadding", """Padding at left of box"""],
1239 ["label_rightPadding", """Padding at right of box"""],
1240 ["label_bottomPadding", """Padding at bottom of box"""],
1241 ["label_simple_pointer", """Set to 1 for simple pointers"""],
1242 ["label_pointer_strokeColor", """Color of indicator line"""],
1243 ["label_pointer_strokeWidth", """Width of indicator line"""]]
1244t=Table(data, colWidths=(130,300))
1245t.setStyle(TableStyle([
1246 ('FONT',(0,0),(-1,0),'Times-Bold',10,12),
1247 ('FONT',(0,1),(0,-1),'Courier',8,8),
1248 ('FONT',(1,1),(1,-1),'Times-Roman',10,12),
1249 ('VALIGN',(0,0),(-1,-1),'MIDDLE'),
1250 ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),
1251 ('BOX', (0,0), (-1,-1), 0.25, colors.black),
1252 ]))
1253getStory().append(t)
1254caption("""Table <seq template="%(Chapter)s-%(Table+)s"/> - Pie.wedges label customization properties""")
1255
1256heading3("Side Labels")
1257
1258disc("""
1259If the sideLabels attribute is set to true, then the labels of
1260the slices are placed in two columns, one on either side of the
1261pie and the start angle of the pie will be set automatically.
1262The anchor of the right hand column is set to 'start' and the
1263anchor of the left hand column is set to 'end'.
1264The distance from the edge of the pie from the edge of either
1265column is decided by the sideLabelsOffset attribute, which is
1266a fraction of the width of the pie.
1267If xradius is changed, the pie can overlap the labels, and so
1268we advise leaving xradius as None.
1269There is an example below.
1270""")
1271
1272from reportlab.graphics.charts.piecharts import sample5, sample7, sample8
1273drawing5 = sample5()
1274draw(drawing5, 'An example of a piechart with sideLabels =1')
1275
1276disc("""
1277If you have sideLabels set to True, then some of the attributes
1278become redundant, such as pointerLabelMode.
1279Also sideLabelsOffset only changes the piechart if sideLabels is
1280set to true.
1281""")
1282
1283heading4("Some issues")
1284
1285disc("""
1286The pointers can cross if there are too many slices.
1287""")
1288
1289drawing7 = sample7()
1290draw(drawing7, 'An example of pointers crossing')
1291
1292disc("""
1293Also the labels can overlap despite checkLabelOverlap if they
1294correspond to slices that are not adjacent.
1295""")
1296
1297drawing8 = sample8()
1298draw(drawing8, 'An example of labels overlapping')
1299
1300heading2("Legends")
11201301
1121disc("""1302disc("""
1122Various preliminary legend classes can be found but need a1303Various preliminary legend classes can be found but need a
@@ -1162,7 +1343,7 @@
1162Nevertheless, here is a list of things that are under way:1343Nevertheless, here is a list of things that are under way:
1163""")1344""")
11641345
1165list("""1346bullet("""
1166Color specification - right now the chart has an undocumented property1347Color specification - right now the chart has an undocumented property
1167$defaultColors$, which provides a list of colors to cycle through,1348$defaultColors$, which provides a list of colors to cycle through,
1168such that each data series gets its own color.1349such that each data series gets its own color.
@@ -1175,7 +1356,7 @@
1175be visible itself.1356be visible itself.
1176""")1357""")
11771358
1178list("""1359bullet("""
1179Additional chart types - when the current design will have become1360Additional chart types - when the current design will have become
1180more stable, we expect to add variants of bar charts to deal with1361more stable, we expect to add variants of bar charts to deal with
1181percentile bars as well as the side-by-side variant seen here.1362percentile bars as well as the side-by-side variant seen here.
11821363
=== modified file 'docs/userguide/graph_concepts.py'
--- docs/userguide/graph_concepts.py 2009-02-22 14:19:44 +0000
+++ docs/userguide/graph_concepts.py 2013-04-14 00:52:26 +0000
@@ -1,6 +1,6 @@
1#Copyright ReportLab Europe Ltd. 2000-20081#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3__version__=''' $Id: graph_concepts.py 3401 2009-01-23 17:41:45Z jonas $ '''3__version__=''' $Id: graph_concepts.py 3959 2012-09-27 14:39:39Z robin $ '''
4from tools.docco.rl_doc_utils import *4from tools.docco.rl_doc_utils import *
55
6heading2("General Concepts")6heading2("General Concepts")
77
=== modified file 'docs/userguide/graph_intro.py'
--- docs/userguide/graph_intro.py 2009-02-22 14:19:44 +0000
+++ docs/userguide/graph_intro.py 2013-04-14 00:52:26 +0000
@@ -1,6 +1,6 @@
1#Copyright ReportLab Europe Ltd. 2000-20081#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3__version__=''' $Id: graph_intro.py 3375 2009-01-16 18:23:19Z jonas $ '''3__version__=''' $Id: graph_intro.py 3959 2012-09-27 14:39:39Z robin $ '''
4from tools.docco.rl_doc_utils import *4from tools.docco.rl_doc_utils import *
55
6heading1("Graphics")6heading1("Graphics")
77
=== modified file 'docs/userguide/graph_shapes.py'
--- docs/userguide/graph_shapes.py 2009-02-22 14:19:44 +0000
+++ docs/userguide/graph_shapes.py 2013-04-14 00:52:26 +0000
@@ -1,6 +1,6 @@
1#Copyright ReportLab Europe Ltd. 2000-20091#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3__version__='''$Id: graph_shapes.py 3375 2009-01-16 18:23:19Z jonas $'''3__version__='''$Id: graph_shapes.py 3959 2012-09-27 14:39:39Z robin $'''
4from tools.docco.rl_doc_utils import *4from tools.docco.rl_doc_utils import *
5from reportlab.graphics.shapes import *5from reportlab.graphics.shapes import *
66
77
=== modified file 'docs/userguide/graph_widgets.py'
--- docs/userguide/graph_widgets.py 2009-02-22 14:19:44 +0000
+++ docs/userguide/graph_widgets.py 2013-04-14 00:52:26 +0000
@@ -1,6 +1,6 @@
1#Copyright ReportLab Europe Ltd. 2000-20081#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3__version__=''' $Id: graph_widgets.py 3375 2009-01-16 18:23:19Z jonas $ '''3__version__=''' $Id: graph_widgets.py 3959 2012-09-27 14:39:39Z robin $ '''
4from tools.docco.rl_doc_utils import *4from tools.docco.rl_doc_utils import *
5from reportlab.graphics.shapes import *5from reportlab.graphics.shapes import *
6from reportlab.graphics.widgets import signsandsymbols6from reportlab.graphics.widgets import signsandsymbols
77
=== modified file 'setup.py'
--- setup.py 2010-12-06 12:45:44 +0000
+++ setup.py 2013-04-14 00:52:26 +0000
@@ -1,6 +1,6 @@
1#Copyright ReportLab Europe Ltd. 2000-20081#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3__version__=''' $Id: setup.py 3730 2010-06-16 11:56:53Z rgbecker $ '''3__version__=''' $Id: setup.py 3963 2012-09-27 16:14:06Z rgbecker $ '''
4import os, sys, glob, ConfigParser, shutil4import os, sys, glob, ConfigParser, shutil
5platform = sys.platform5platform = sys.platform
6pjoin = os.path.join6pjoin = os.path.join
@@ -209,10 +209,10 @@
209 'fonts/_eb_____.pfb',209 'fonts/_eb_____.pfb',
210 'fonts/_ei_____.pfb',210 'fonts/_ei_____.pfb',
211 'fonts/_er_____.pfb',211 'fonts/_er_____.pfb',
212 'fonts/Sy______.pfb',212 'fonts/sy______.pfb',
213 'fonts/Zd______.pfb',213 'fonts/zd______.pfb',
214 'fonts/Zx______.pfb',214 'fonts/zx______.pfb',
215 'fonts/Zy______.pfb',215 'fonts/zy______.pfb',
216 ]216 ]
217217
218def get_fonts(PACKAGE_DIR, reportlab_files):218def get_fonts(PACKAGE_DIR, reportlab_files):
@@ -224,7 +224,7 @@
224 try:224 try:
225 #infoline("Downloading standard T1 font curves")225 #infoline("Downloading standard T1 font curves")
226226
227 #remotehandle = urllib2.urlopen("http://www.reportlab.com/ftp/fonts/pfbfer.zip")227 #remotehandle = urllib2.urlopen("http://www.reportlab.com/ftp/pfbfer-20070710.zip")
228 #zipdata = StringIO.StringIO(remotehandle.read())228 #zipdata = StringIO.StringIO(remotehandle.read())
229 #remotehandle.close()229 #remotehandle.close()
230 archive = zipfile.ZipFile(zipdata)230 archive = zipfile.ZipFile(zipdata)
@@ -417,7 +417,7 @@
417 setup(417 setup(
418 name="reportlab",418 name="reportlab",
419 version=get_version(),419 version=get_version(),
420 license="BSD license (see license.txt for details), Copyright (c) 2000-2010, ReportLab Inc.",420 license="BSD license (see license.txt for details), Copyright (c) 2000-2012, ReportLab Inc.",
421 description="The Reportlab Toolkit",421 description="The Reportlab Toolkit",
422 long_description="""The ReportLab Toolkit. An Open Source Python library for generating PDFs and graphics.""",422 long_description="""The ReportLab Toolkit. An Open Source Python library for generating PDFs and graphics.""",
423423
424424
=== modified file 'src/reportlab/__init__.py'
--- src/reportlab/__init__.py 2010-12-06 12:45:44 +0000
+++ src/reportlab/__init__.py 2013-04-14 00:52:26 +0000
@@ -1,21 +1,25 @@
1#Copyright ReportLab Europe Ltd. 2000-20041#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/__init__.py3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/__init__.py
4__version__=''' $Id: __init__.py 3788 2010-09-29 10:44:00Z rgbecker $ '''4__version__=''' $Id: __init__.py 3959 2012-09-27 14:39:39Z robin $ '''
5__doc__="""The Reportlab PDF generation library."""5__doc__="""The Reportlab PDF generation library."""
6Version = "2.5"6Version = "2.6"
77
8import sys8import sys
99
10if sys.version_info[0:2] < (2, 4):10if sys.version_info[0:2] < (2, 5):
11 warning = """The trunk of reportlab requires Python 2.4 or higher.11 warning = """The trunk of reportlab currently requires Python 2.5 or higher.
1212
13 Python 2.3 users may still use ReportLab 2.4 or any other bugfixes13 Python 2.3 users may still use ReportLab 2.4 or any other bugfixes
14 derived from it. Python 2.2 and below need to use released versions 14 derived from it, and Python 2.4 users may use ReportLab 2.5.
15 beginning with 1.x (e.g. 1.21), or snapshots or checkouts from 15 Python 2.2 and below need to use released versions beginning with
16 our 'version1' branch.16 1.x (e.g. 1.21), or snapshots or checkouts from our 'version1' branch.
17
18 Our current plan is to remove Python 2.5 compatibility on our next release,
19 allowing us to use the 2to3 tool and work on Python 3.0 compatibility.
20 If you have a choice, Python 2.7.x is best long term version to use.
17 """21 """
18 raise ImportError("reportlab needs Python 2.4 or higher", warning)22 raise ImportError("reportlab needs Python 2.5 or higher", warning)
1923
20def getStory(context):24def getStory(context):
21 "This is a helper for our old autogenerated documentation system"25 "This is a helper for our old autogenerated documentation system"
2226
=== modified file 'src/reportlab/graphics/__init__.py'
--- src/reportlab/graphics/__init__.py 2009-02-22 14:19:44 +0000
+++ src/reportlab/graphics/__init__.py 2013-04-14 00:52:26 +0000
@@ -1,6 +1,6 @@
1#Copyright ReportLab Europe Ltd. 2000-20041#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/__init__.py3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/__init__.py
4__version__=''' $Id: __init__.py 3345 2008-12-12 17:55:22Z damian $ '''4__version__=''' $Id: __init__.py 3959 2012-09-27 14:39:39Z robin $ '''
5__doc__='''Framework for reusable object graphics, in PDF or bitmap form'''5__doc__='''Framework for reusable object graphics, in PDF or bitmap form'''
66
77
=== modified file 'src/reportlab/graphics/barcode/__init__.py'
--- src/reportlab/graphics/barcode/__init__.py 2010-12-06 12:45:44 +0000
+++ src/reportlab/graphics/barcode/__init__.py 2013-04-14 00:52:26 +0000
@@ -42,7 +42,7 @@
42 BarcodePOSTNET, BarcodeUSPS_4State42 BarcodePOSTNET, BarcodeUSPS_4State
4343
44 #newer codes will typically get their own module44 #newer codes will typically get their own module
45 from eanbc import Ean13BarcodeWidget, Ean8BarcodeWidget45 from eanbc import Ean13BarcodeWidget, Ean8BarcodeWidget, UPCA
46 from qr import QrCodeWidget46 from qr import QrCodeWidget
4747
4848
@@ -64,6 +64,7 @@
64 BarcodeUSPS_4State,64 BarcodeUSPS_4State,
65 Ean13BarcodeWidget,65 Ean13BarcodeWidget,
66 Ean8BarcodeWidget,66 Ean8BarcodeWidget,
67 UPCA,
67 QrCodeWidget,68 QrCodeWidget,
68 ):69 ):
69 codeName = widget.codeName70 codeName = widget.codeName
7071
=== modified file 'src/reportlab/graphics/barcode/eanbc.py'
--- src/reportlab/graphics/barcode/eanbc.py 2010-12-06 12:45:44 +0000
+++ src/reportlab/graphics/barcode/eanbc.py 2013-04-14 00:52:26 +0000
@@ -113,15 +113,16 @@
113 else:113 else:
114 manufacturerCodes[int(k)] = v114 manufacturerCodes[int(k)] = v
115115
116class isEan13String(Validator):116def nDigits(n):
117 def test(self,x):117 class _ndigits(Validator):
118 return type(x) is str and len(x)<=12 and len([c for c in x if c in "0123456789"])==12118 def test(self,x):
119isEan13String = isEan13String()119 return type(x) is str and len(x)<=n and len([c for c in x if c in "0123456789"])==n
120 return _ndigits()
120121
121class Ean13BarcodeWidget(PlotArea):122class Ean13BarcodeWidget(PlotArea):
122 codeName = "EAN13"123 codeName = "EAN13"
123 _attrMap = AttrMap(BASE=PlotArea,124 _attrMap = AttrMap(BASE=PlotArea,
124 value = AttrMapValue(isEan13String, desc='the number'),125 value = AttrMapValue(nDigits(12), desc='the number'),
125 fontName = AttrMapValue(isString, desc='fontName'),126 fontName = AttrMapValue(isString, desc='fontName'),
126 fontSize = AttrMapValue(isNumber, desc='font size'),127 fontSize = AttrMapValue(isNumber, desc='font size'),
127 x = AttrMapValue(isNumber, desc='x-coord'),128 x = AttrMapValue(isNumber, desc='x-coord'),
@@ -295,15 +296,10 @@
295 return chr(z+((10-(iSum%10))%10))296 return chr(z+((10-(iSum%10))%10))
296 _checkdigit=classmethod(_checkdigit)297 _checkdigit=classmethod(_checkdigit)
297298
298class isEan8String(Validator):
299 def test(self,x):
300 return type(x) is str and len(x)<=7 and len([c for c in x if c in "0123456789"])==7
301isEan8String = isEan8String()
302
303class Ean8BarcodeWidget(Ean13BarcodeWidget):299class Ean8BarcodeWidget(Ean13BarcodeWidget):
304 codeName = "EAN8"300 codeName = "EAN8"
305 _attrMap = AttrMap(BASE=Ean13BarcodeWidget,301 _attrMap = AttrMap(BASE=Ean13BarcodeWidget,
306 value = AttrMapValue(isEan8String, desc='the number'),302 value = AttrMapValue(nDigits(7), desc='the number'),
307 )303 )
308 _start_right = 4 #for ean-13 left = [0:7] right=[7:13]304 _start_right = 4 #for ean-13 left = [0:7] right=[7:13]
309 _nbars = 85305 _nbars = 85
@@ -339,3 +335,14 @@
339 x = (59.5-9+self._lquiet)*barWidth335 x = (59.5-9+self._lquiet)*barWidth
340 c = s[4:]336 c = s[4:]
341 gAdd(String(x,y,c,fontName=fontName,fontSize=fontSize,fillColor=textColor,textAnchor='middle'))337 gAdd(String(x,y,c,fontName=fontName,fontSize=fontSize,fillColor=textColor,textAnchor='middle'))
338
339class UPCA(Ean13BarcodeWidget):
340 codeName = "UPCA"
341 _attrMap = AttrMap(BASE=Ean13BarcodeWidget,
342 value = AttrMapValue(nDigits(11), desc='the number'),
343 )
344 _start_right = 6
345 _digits = 11
346 _0csw = 3
347 _1csw = 1
348 _nbars = 1+7*11+2*3+5
342349
=== modified file 'src/reportlab/graphics/barcode/test.py'
--- src/reportlab/graphics/barcode/test.py 2008-10-19 23:16:31 +0000
+++ src/reportlab/graphics/barcode/test.py 2013-04-14 00:52:26 +0000
@@ -63,6 +63,10 @@
63 story.append(bcd)63 story.append(bcd)
64 story.append(Paragraph('EAN8', styleN))64 story.append(Paragraph('EAN8', styleN))
65 bcd = createBarcodeDrawing('EAN8', value='1234567')65 bcd = createBarcodeDrawing('EAN8', value='1234567')
66 story.append(bcd)
67 story.append(Paragraph('UPCA', styleN))
68 bcd = createBarcodeDrawing('UPCA', value='03600029145')
69 story.append(bcd)
66 story.append(Paragraph('USPS_4State', styleN))70 story.append(Paragraph('USPS_4State', styleN))
67 bcd = createBarcodeDrawing('USPS_4State', value='01234567094987654321',routing='01234567891')71 bcd = createBarcodeDrawing('USPS_4State', value='01234567094987654321',routing='01234567891')
68 story.append(bcd)72 story.append(bcd)
6973
=== modified file 'src/reportlab/graphics/barcode/usps4s.py'
--- src/reportlab/graphics/barcode/usps4s.py 2008-10-19 23:16:31 +0000
+++ src/reportlab/graphics/barcode/usps4s.py 2013-04-14 00:52:26 +0000
@@ -1,6 +1,6 @@
1#copyright ReportLab Inc. 2000-20061#copyright ReportLab Inc. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3__version__=''' $Id: usps4s.py 2966 2006-08-31 15:20:29Z rgbecker $ '''3__version__=''' $Id: usps4s.py 3959 2012-09-27 14:39:39Z robin $ '''
4__all__ = ('USPS_4State',)4__all__ = ('USPS_4State',)
55
6from reportlab.lib.colors import black6from reportlab.lib.colors import black
77
=== modified file 'src/reportlab/graphics/barcode/widgets.py'
--- src/reportlab/graphics/barcode/widgets.py 2010-12-06 12:45:44 +0000
+++ src/reportlab/graphics/barcode/widgets.py 2013-04-14 00:52:26 +0000
@@ -1,6 +1,6 @@
1#copyright ReportLab Europe Limited. 2000-20061#copyright ReportLab Europe Limited. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3__version__=''' $Id: widgets.py 3764 2010-09-06 13:24:45Z juraj $ '''3__version__=''' $Id: widgets.py 3959 2012-09-27 14:39:39Z robin $ '''
4__all__= (4__all__= (
5 'BarcodeI2of5',5 'BarcodeI2of5',
6 'BarcodeCode128',6 'BarcodeCode128',
77
=== modified file 'src/reportlab/graphics/charts/__init__.py'
--- src/reportlab/graphics/charts/__init__.py 2009-02-22 14:19:44 +0000
+++ src/reportlab/graphics/charts/__init__.py 2013-04-14 00:52:26 +0000
@@ -1,5 +1,5 @@
1#Copyright ReportLab Europe Ltd. 2000-20041#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/__init__.py3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/__init__.py
4__version__=''' $Id: __init__.py 3345 2008-12-12 17:55:22Z damian $ '''4__version__=''' $Id: __init__.py 3959 2012-09-27 14:39:39Z robin $ '''
5__doc__='''Business charts'''5__doc__='''Business charts'''
66
=== modified file 'src/reportlab/graphics/charts/areas.py'
--- src/reportlab/graphics/charts/areas.py 2010-02-16 23:32:55 +0000
+++ src/reportlab/graphics/charts/areas.py 2013-04-14 00:52:26 +0000
@@ -1,8 +1,8 @@
1#Copyright ReportLab Europe Ltd. 2000-20041#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/areas.py3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/areas.py
44
5__version__=''' $Id: areas.py 3602 2009-11-26 16:25:50Z meitham $ '''5__version__=''' $Id: areas.py 3959 2012-09-27 14:39:39Z robin $ '''
6__doc__='''This module defines a Area mixin classes'''6__doc__='''This module defines a Area mixin classes'''
77
8from reportlab.lib.validators import isNumber, isColor, isColorOrNone, isNoneOrShape8from reportlab.lib.validators import isNumber, isColor, isColorOrNone, isNoneOrShape
99
=== modified file 'src/reportlab/graphics/charts/axes.py'
--- src/reportlab/graphics/charts/axes.py 2010-12-06 12:45:44 +0000
+++ src/reportlab/graphics/charts/axes.py 2013-04-14 00:52:26 +0000
@@ -1,6 +1,6 @@
1#Copyright ReportLab Europe Ltd. 2000-20101#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3__version__=''' $Id: axes.py 3748 2010-07-27 09:36:33Z rgbecker $ '''3__version__=''' $Id: axes.py 3959 2012-09-27 14:39:39Z robin $ '''
4__doc__="""Collection of axes for charts.4__doc__="""Collection of axes for charts.
55
6The current collection comprises axes for charts using cartesian6The current collection comprises axes for charts using cartesian
@@ -37,10 +37,12 @@
37 isNormalDate37 isNormalDate
38from reportlab.lib.attrmap import *38from reportlab.lib.attrmap import *
39from reportlab.lib import normalDate39from reportlab.lib import normalDate
40from reportlab.graphics.shapes import Drawing, Line, PolyLine, Group, STATE_DEFAULTS, _textBoxLimits, _rotatedBoxLimits40from reportlab.graphics.shapes import Drawing, Line, PolyLine, Rect, Group, STATE_DEFAULTS, _textBoxLimits, _rotatedBoxLimits
41from reportlab.graphics.widgetbase import Widget, TypedPropertyCollection41from reportlab.graphics.widgetbase import Widget, TypedPropertyCollection
42from reportlab.graphics.charts.textlabels import Label42from reportlab.graphics.charts.textlabels import Label
43from reportlab.graphics.charts.utils import nextRoundNumber43from reportlab.graphics.charts.utils import nextRoundNumber
44from reportlab.graphics.widgets.grids import ShadedRect
45from reportlab.lib.colors import Color
44import copy46import copy
4547
4648
@@ -76,8 +78,8 @@
76class AxisLineAnnotation:78class AxisLineAnnotation:
77 '''Create a grid like line using the given user value to draw the line79 '''Create a grid like line using the given user value to draw the line
78 kwds may contain80 kwds may contain
79 startOffset offset from the default grid start position81 startOffset if true v is offset from the default grid start position
80 endOffset offset from the default grid end position82 endOffset if true v is offset from the default grid end position
81 scaleValue True/not given --> scale the value83 scaleValue True/not given --> scale the value
82 otherwise use the absolute value84 otherwise use the absolute value
83 lo lowest coordinate to draw default 085 lo lowest coordinate to draw default 0
@@ -93,10 +95,14 @@
93 def __call__(self,axis):95 def __call__(self,axis):
94 kwds = self._kwds.copy()96 kwds = self._kwds.copy()
95 scaleValue = kwds.pop('scaleValue',True)97 scaleValue = kwds.pop('scaleValue',True)
98 endOffset = kwds.pop('endOffset',False)
99 startOffset = kwds.pop('endOffset',False)
96 if axis.isYAxis:100 if axis.isYAxis:
97 offs = axis._x101 offs = axis._x
102 d0 = axis._y
98 else:103 else:
99 offs = axis._y104 offs = axis._y
105 d0 = axis._x
100 s = kwds.pop('start',None)106 s = kwds.pop('start',None)
101 e = kwds.pop('end',None)107 e = kwds.pop('end',None)
102 if s is None or e is None:108 if s is None or e is None:
@@ -109,15 +115,19 @@
109 else:115 else:
110 if s is None: s = 0116 if s is None: s = 0
111 if e is None: e = 0117 if e is None: e = 0
112 hi = kwds.pop('hi',axis._length)118 hi = kwds.pop('hi',axis._length)+d0
113 lo = kwds.pop('lo',0)119 lo = kwds.pop('lo',0)+d0
114 lo,hi=min(lo,hi),max(lo,hi)120 lo,hi=min(lo,hi),max(lo,hi)
115 drawAtLimit = kwds.pop('drawAtLimit',False)121 drawAtLimit = kwds.pop('drawAtLimit',False)
122 oaglp = axis._get_line_pos
116 if not scaleValue:123 if not scaleValue:
117 oaglp = axis._get_line_pos
118 axis._get_line_pos = lambda x: x124 axis._get_line_pos = lambda x: x
119 try:125 try:
120 v = self._v126 v = self._v
127 if endOffset:
128 v = v + hi
129 elif startOffset:
130 v = v + lo
121 func = axis._getLineFunc(s-offs,e-offs,kwds.pop('parent',None))131 func = axis._getLineFunc(s-offs,e-offs,kwds.pop('parent',None))
122 if not hasattr(axis,'_tickValues'):132 if not hasattr(axis,'_tickValues'):
123 axis._pseudo_configure()133 axis._pseudo_configure()
@@ -133,10 +143,78 @@
133 for k,v in kwds.iteritems():143 for k,v in kwds.iteritems():
134 setattr(L,k,v)144 setattr(L,k,v)
135 finally:145 finally:
136 if not scaleValue:146 axis._get_line_pos = oaglp
137 axis._get_line_pos = oaglp
138 return L147 return L
139148
149class AxisBackgroundAnnotation:
150 '''Create a set of coloured bars on the background of a chart using axis ticks as the bar borders
151 colors is a set of colors to use for the background bars. A colour of None is just a skip.
152 Special effects if you pass a rect or Shaded rect instead.
153 '''
154 def __init__(self,colors,**kwds):
155 self._colors = colors
156 self._kwds = kwds
157
158 def __call__(self,axis):
159 colors = self._colors
160 if not colors: return
161 kwds = self._kwds.copy()
162 isYAxis = axis.isYAxis
163 if isYAxis:
164 offs = axis._x
165 d0 = axis._y
166 else:
167 offs = axis._y
168 d0 = axis._x
169 s = kwds.pop('start',None)
170 e = kwds.pop('end',None)
171 if s is None or e is None:
172 dim = getattr(getattr(axis,'joinAxis',None),'getGridDims',None)
173 if dim and hasattr(dim,'__call__'):
174 dim = dim()
175 if dim:
176 if s is None: s = dim[0]
177 if e is None: e = dim[1]
178 else:
179 if s is None: s = 0
180 if e is None: e = 0
181 if not hasattr(axis,'_tickValues'):
182 axis._pseudo_configure()
183 tv = getattr(axis,'_tickValues',None)
184 if not tv: return
185 G = Group()
186 ncolors = len(colors)
187 v0 = axis._get_line_pos(tv[0])
188 for i in xrange(1,len(tv)):
189 v1 = axis._get_line_pos(tv[i])
190 c = colors[(i-1)%ncolors]
191 if c:
192 if isYAxis:
193 y = v0
194 x = s
195 height = v1-v0
196 width = e-s
197 else:
198 x = v0
199 y = s
200 width = v1-v0
201 height = e-s
202 if isinstance(c,Color):
203 r = Rect(x,y,width,height,fillColor=c,strokeColor=None)
204 elif isinstance(c,Rect):
205 r = Rect(x,y,width,height)
206 for k in c.__dict__:
207 if k not in ('x','y','width','height'):
208 setattr(r,k,getattr(c,k))
209 elif isinstance(c,ShadedRect):
210 r = ShadedRect(x=x,y=y,width=width,height=height)
211 for k in c.__dict__:
212 if k not in ('x','y','width','height'):
213 setattr(r,k,getattr(c,k))
214 G.add(r)
215 v0 = v1
216 return G
217
140class TickLU:218class TickLU:
141 '''lookup special cases for tick values'''219 '''lookup special cases for tick values'''
142 def __init__(self,*T,**kwds):220 def __init__(self,*T,**kwds):
@@ -375,6 +453,7 @@
375 annotations = AttrMapValue(None,desc='list of annotations'),453 annotations = AttrMapValue(None,desc='list of annotations'),
376 loLLen = AttrMapValue(isNumber, desc='extra line length before start of the axis'),454 loLLen = AttrMapValue(isNumber, desc='extra line length before start of the axis'),
377 hiLLen = AttrMapValue(isNumber, desc='extra line length after end of the axis'),455 hiLLen = AttrMapValue(isNumber, desc='extra line length after end of the axis'),
456 skipGrid = AttrMapValue(OneOf('none','top','both','bottom'),"grid lines to skip top bottom both none"),
378 )457 )
379458
380 def __init__(self):459 def __init__(self):
@@ -612,31 +691,24 @@
612691
613 def joinToAxis(self, yAxis, mode='bottom', pos=None):692 def joinToAxis(self, yAxis, mode='bottom', pos=None):
614 "Join with y-axis using some mode."693 "Join with y-axis using some mode."
615
616 _assertYAxis(yAxis)694 _assertYAxis(yAxis)
617 if mode == 'bottom':695 if mode == 'bottom':
618 self._x = yAxis._x
619 self._y = yAxis._y696 self._y = yAxis._y
620 elif mode == 'top':697 elif mode == 'top':
621 self._x = yAxis._x
622 self._y = yAxis._y + yAxis._length698 self._y = yAxis._y + yAxis._length
623 elif mode == 'value':699 elif mode == 'value':
624 self._x = yAxis._x
625 self._y = yAxis.scale(pos)700 self._y = yAxis.scale(pos)
626 elif mode == 'points':701 elif mode == 'points':
627 self._x = yAxis._x
628 self._y = pos702 self._y = pos
629703
630 def _joinToAxis(self):704 def _joinToAxis(self):
631 ja = self.joinAxis705 ja = self.joinAxis
632 if ja:706 if ja:
633 jam = self.joinAxisMode707 jam = self.joinAxisMode
634 jap = self.joinAxisPos
635 jta = self.joinToAxis
636 if jam in ('bottom', 'top'):708 if jam in ('bottom', 'top'):
637 jta(ja, mode=jam)709 self.joinToAxis(ja, mode=jam)
638 elif jam in ('value', 'points'):710 elif jam in ('value', 'points'):
639 jta(ja, mode=jam, pos=jap)711 self.joinToAxis(ja, mode=jam, pos=self.joinAxisPos)
640712
641 def scale(self, idx):713 def scale(self, idx):
642 """returns the x position and width in drawing units of the slice"""714 """returns the x position and width in drawing units of the slice"""
@@ -726,30 +798,23 @@
726 "Join with x-axis using some mode."798 "Join with x-axis using some mode."
727799
728 _assertXAxis(xAxis)800 _assertXAxis(xAxis)
729
730 if mode == 'left':801 if mode == 'left':
731 self._x = xAxis._x * 1.0802 self._x = xAxis._x * 1.0
732 self._y = xAxis._y * 1.0
733 elif mode == 'right':803 elif mode == 'right':
734 self._x = (xAxis._x + xAxis._length) * 1.0804 self._x = (xAxis._x + xAxis._length) * 1.0
735 self._y = xAxis._y * 1.0
736 elif mode == 'value':805 elif mode == 'value':
737 self._x = xAxis.scale(pos) * 1.0806 self._x = xAxis.scale(pos) * 1.0
738 self._y = xAxis._y * 1.0
739 elif mode == 'points':807 elif mode == 'points':
740 self._x = pos * 1.0808 self._x = pos * 1.0
741 self._y = xAxis._y * 1.0
742809
743 def _joinToAxis(self):810 def _joinToAxis(self):
744 ja = self.joinAxis811 ja = self.joinAxis
745 if ja:812 if ja:
746 jam = self.joinAxisMode813 jam = self.joinAxisMode
747 jap = self.joinAxisPos
748 jta = self.joinToAxis
749 if jam in ('left', 'right'):814 if jam in ('left', 'right'):
750 jta(ja, mode=jam)815 self.joinToAxis(ja, mode=jam)
751 elif jam in ('value', 'points'):816 elif jam in ('value', 'points'):
752 jta(ja, mode=jam, pos=jap)817 self.joinToAxis(ja, mode=jam, pos=self.joinAxisPos)
753818
754 def scale(self, idx):819 def scale(self, idx):
755 "Returns the y position and width in drawing units of the slice."820 "Returns the y position and width in drawing units of the slice."
@@ -872,6 +937,7 @@
872 subGridStart = AttrMapValue(isNumberOrNone, desc='Start of grid lines wrt axis origin'),937 subGridStart = AttrMapValue(isNumberOrNone, desc='Start of grid lines wrt axis origin'),
873 subGridEnd = AttrMapValue(isNumberOrNone, desc='End of grid lines wrt axis origin'),938 subGridEnd = AttrMapValue(isNumberOrNone, desc='End of grid lines wrt axis origin'),
874 keepTickLabelsInside = AttrMapValue(isBoolean, desc='Ensure tick labels do not project beyond bounds of axis if true'),939 keepTickLabelsInside = AttrMapValue(isBoolean, desc='Ensure tick labels do not project beyond bounds of axis if true'),
940 skipGrid = AttrMapValue(OneOf('none','top','both','bottom'),"grid lines to skip top bottom both none"),
875 )941 )
876942
877 def __init__(self,**kw):943 def __init__(self,**kw):
@@ -1377,28 +1443,22 @@
1377 "Join with y-axis using some mode."1443 "Join with y-axis using some mode."
1378 _assertYAxis(yAxis)1444 _assertYAxis(yAxis)
1379 if mode == 'bottom':1445 if mode == 'bottom':
1380 self._x = yAxis._x * 1.0
1381 self._y = yAxis._y * 1.01446 self._y = yAxis._y * 1.0
1382 elif mode == 'top':1447 elif mode == 'top':
1383 self._x = yAxis._x * 1.0
1384 self._y = (yAxis._y + yAxis._length) * 1.01448 self._y = (yAxis._y + yAxis._length) * 1.0
1385 elif mode == 'value':1449 elif mode == 'value':
1386 self._x = yAxis._x * 1.0
1387 self._y = yAxis.scale(pos) * 1.01450 self._y = yAxis.scale(pos) * 1.0
1388 elif mode == 'points':1451 elif mode == 'points':
1389 self._x = yAxis._x * 1.0
1390 self._y = pos * 1.01452 self._y = pos * 1.0
13911453
1392 def _joinToAxis(self):1454 def _joinToAxis(self):
1393 ja = self.joinAxis1455 ja = self.joinAxis
1394 if ja:1456 if ja:
1395 jam = self.joinAxisMode1457 jam = self.joinAxisMode or 'bottom'
1396 jap = self.joinAxisPos
1397 jta = self.joinToAxis
1398 if jam in ('bottom', 'top'):1458 if jam in ('bottom', 'top'):
1399 jta(ja, mode=jam)1459 self.joinToAxis(ja, mode=jam)
1400 elif jam in ('value', 'points'):1460 elif jam in ('value', 'points'):
1401 jta(ja, mode=jam, pos=jap)1461 self.joinToAxis(ja, mode=jam, pos=self.joinAxisPos)
14021462
1403 def makeAxis(self):1463 def makeAxis(self):
1404 g = Group()1464 g = Group()
@@ -1485,6 +1545,7 @@
1485 dailyFreq = AttrMapValue(isBoolean, desc='True if we are to assume daily data to be ticked at end of month.'),1545 dailyFreq = AttrMapValue(isBoolean, desc='True if we are to assume daily data to be ticked at end of month.'),
1486 specifiedTickDates = AttrMapValue(NoneOr(SequenceOf(isNormalDate)), desc='Actual tick values to use; no calculations done'),1546 specifiedTickDates = AttrMapValue(NoneOr(SequenceOf(isNormalDate)), desc='Actual tick values to use; no calculations done'),
1487 specialTickClear = AttrMapValue(isBoolean, desc='clear rather than delete close ticks when forced first/end dates'),1547 specialTickClear = AttrMapValue(isBoolean, desc='clear rather than delete close ticks when forced first/end dates'),
1548 skipGrid = AttrMapValue(OneOf('none','top','both','bottom'),"grid lines to skip top bottom both none"),
1488 )1549 )
14891550
1490 _valueClass = normalDate.ND1551 _valueClass = normalDate.ND
@@ -1755,27 +1816,21 @@
1755 _assertXAxis(xAxis)1816 _assertXAxis(xAxis)
1756 if mode == 'left':1817 if mode == 'left':
1757 self._x = xAxis._x * 1.01818 self._x = xAxis._x * 1.0
1758 self._y = xAxis._y * 1.0
1759 elif mode == 'right':1819 elif mode == 'right':
1760 self._x = (xAxis._x + xAxis._length) * 1.01820 self._x = (xAxis._x + xAxis._length) * 1.0
1761 self._y = xAxis._y * 1.0
1762 elif mode == 'value':1821 elif mode == 'value':
1763 self._x = xAxis.scale(pos) * 1.01822 self._x = xAxis.scale(pos) * 1.0
1764 self._y = xAxis._y * 1.0
1765 elif mode == 'points':1823 elif mode == 'points':
1766 self._x = pos * 1.01824 self._x = pos * 1.0
1767 self._y = xAxis._y * 1.0
17681825
1769 def _joinToAxis(self):1826 def _joinToAxis(self):
1770 ja = self.joinAxis1827 ja = self.joinAxis
1771 if ja:1828 if ja:
1772 jam = self.joinAxisMode1829 jam = self.joinAxisMode
1773 jap = self.joinAxisPos
1774 jta = self.joinToAxis
1775 if jam in ('left', 'right'):1830 if jam in ('left', 'right'):
1776 jta(ja, mode=jam)1831 self.joinToAxis(ja, mode=jam)
1777 elif jam in ('value', 'points'):1832 elif jam in ('value', 'points'):
1778 jta(ja, mode=jam, pos=jap)1833 self.joinToAxis(ja, mode=jam, pos=self.joinAxisPos)
17791834
1780 def makeAxis(self):1835 def makeAxis(self):
1781 g = Group()1836 g = Group()
17821837
=== modified file 'src/reportlab/graphics/charts/barcharts.py'
--- src/reportlab/graphics/charts/barcharts.py 2010-12-06 12:45:44 +0000
+++ src/reportlab/graphics/charts/barcharts.py 2013-04-14 00:52:26 +0000
@@ -1,7 +1,7 @@
1#Copyright ReportLab Europe Ltd. 2000-20041#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/barcharts.py3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/barcharts.py
4__version__=''' $Id: barcharts.py 3761 2010-09-02 14:40:46Z damian $ '''4__version__=''' $Id: barcharts.py 3959 2012-09-27 14:39:39Z robin $ '''
5__doc__="""This module defines a variety of Bar Chart components.5__doc__="""This module defines a variety of Bar Chart components.
66
7The basic flavors are stacked and side-by-side, available in horizontal and7The basic flavors are stacked and side-by-side, available in horizontal and
@@ -49,7 +49,7 @@
49 "Abstract base class, unusable by itself."49 "Abstract base class, unusable by itself."
5050
51 _attrMap = AttrMap(BASE=PlotArea,51 _attrMap = AttrMap(BASE=PlotArea,
52 useAbsolute = AttrMapValue(EitherOr((isBoolean,EitherOr((isString,isNumber)))), desc='Flag to use absolute spacing values; use string of gsb for finer control\n(g=groupSpacing,s=barSpacing,b=barWidth). ',advancedUsage=1),52 useAbsolute = AttrMapValue(EitherOr((isBoolean,EitherOr((isString,isNumber)))), desc='Flag to use absolute spacing values; use string of gsb for finer control\n(g=groupSpacing,s=barSpacing,b=barWidth).',advancedUsage=1),
53 barWidth = AttrMapValue(isNumber, desc='The width of an individual bar.'),53 barWidth = AttrMapValue(isNumber, desc='The width of an individual bar.'),
54 groupSpacing = AttrMapValue(isNumber, desc='Width between groups of bars.'),54 groupSpacing = AttrMapValue(isNumber, desc='Width between groups of bars.'),
55 barSpacing = AttrMapValue(isNumber, desc='Width between individual bars.'),55 barSpacing = AttrMapValue(isNumber, desc='Width between individual bars.'),
@@ -67,6 +67,16 @@
67 categoryLabelBarSize = AttrMapValue(isNumber, desc='width to leave for a category label to go between categories.'),67 categoryLabelBarSize = AttrMapValue(isNumber, desc='width to leave for a category label to go between categories.'),
68 categoryLabelBarOrder = AttrMapValue(OneOf('first','last','auto'), desc='where any label bar should appear first/last'),68 categoryLabelBarOrder = AttrMapValue(OneOf('first','last','auto'), desc='where any label bar should appear first/last'),
69 barRecord = AttrMapValue(None, desc='callable(bar,label=labelText,value=value,**kwds) to record bar information', advancedUsage=1),69 barRecord = AttrMapValue(None, desc='callable(bar,label=labelText,value=value,**kwds) to record bar information', advancedUsage=1),
70 zIndexOverrides = AttrMapValue(isStringOrNone, desc='''None (the default ie use old z ordering scheme) or a ',' separated list of key=value (int/float) for new zIndex ordering. If used defaults are
71 background=0,
72 categoryAxis=1,
73 valueAxis=2,
74 bars=3,
75 barLabels=4,
76 categoryAxisGrid=5,
77 valueAxisGrid=6,
78 annotations=7'''),
79 categoryNALabel = AttrMapValue(NoneOrInstanceOfNA_Label, desc='Label to use for a group of N/A values.',advancedUsage=1),
70 )80 )
7181
72 def makeSwatchSample(self, rowNo, x, y, width, height):82 def makeSwatchSample(self, rowNo, x, y, width, height):
@@ -144,8 +154,8 @@
144 self.bars[0].fillColor = colors.red154 self.bars[0].fillColor = colors.red
145 self.bars[1].fillColor = colors.green155 self.bars[1].fillColor = colors.green
146 self.bars[2].fillColor = colors.blue156 self.bars[2].fillColor = colors.blue
147 self.naLabel = None #NA_Label()157 self.naLabel = self.categoryNALabel = None
148158 self.zIndexOverrides = None
149159
150 def demo(self):160 def demo(self):
151 """Shows basic use of a bar chart"""161 """Shows basic use of a bar chart"""
@@ -194,17 +204,68 @@
194 cA.configure(self._configureData)204 cA.configure(self._configureData)
195 self.calcBarPositions()205 self.calcBarPositions()
196 g = Group()206 g = Group()
197 g.add(self.makeBackground())207
198 cAdgl = getattr(cA,'drawGridLast',False)208 zIndex = getattr(self,'zIndexOverrides',None)
199 vAdgl = getattr(vA,'drawGridLast',False)209 if not zIndex:
200 if not cAdgl: cA.makeGrid(g,parent=self, dim=vA.getGridDims)210 g.add(self.makeBackground())
201 if not vAdgl: vA.makeGrid(g,parent=self, dim=cA.getGridDims)211 cAdgl = getattr(cA,'drawGridLast',False)
202 g.add(self.makeBars())212 vAdgl = getattr(vA,'drawGridLast',False)
203 g.add(cA)213 if not cAdgl: cA.makeGrid(g,parent=self, dim=vA.getGridDims)
204 g.add(vA)214 if not vAdgl: vA.makeGrid(g,parent=self, dim=cA.getGridDims)
205 if cAdgl: cA.makeGrid(g,parent=self, dim=vA.getGridDims)215 g.add(self.makeBars())
206 if vAdgl: vA.makeGrid(g,parent=self, dim=cA.getGridDims)216 g.add(cA)
207 for a in getattr(self,'annotations',()): g.add(a(self,cA.scale,vA.scale))217 g.add(vA)
218 if cAdgl: cA.makeGrid(g,parent=self, dim=vA.getGridDims)
219 if vAdgl: vA.makeGrid(g,parent=self, dim=cA.getGridDims)
220 for a in getattr(self,'annotations',()): g.add(a(self,cA.scale,vA.scale))
221 else:
222 Z=dict(
223 background=0,
224 categoryAxis=1,
225 valueAxis=2,
226 bars=3,
227 barLabels=4,
228 categoryAxisGrid=5,
229 valueAxisGrid=6,
230 annotations=7,
231 )
232 for z in zIndex.strip().split(','):
233 z = z.strip()
234 if not z: continue
235 try:
236 k,v=z.split('=')
237 except:
238 raise ValueError('Badly formatted zIndex clause %r in %r\nallowed variables are\n%s' % (z,zIndex,'\n'.join(['%s=%r'% (k,Z[k]) for k in sorted(Z.keys())])))
239 if k not in Z:
240 raise ValueError('Unknown zIndex variable %r in %r\nallowed variables are\n%s' % (k,Z,'\n'.join(['%s=%r'% (k,Z[k]) for k in sorted(Z.keys())])))
241 try:
242 v = eval(v,{}) #only constants allowed
243 assert isinstance(v,(float,int))
244 except:
245 raise ValueError('Bad zIndex value %r in clause %r of zIndex\nallowed variables are\n%s' % (v,z,zIndex,'\n'.join(['%s=%r'% (k,Z[k]) for k in sorted(Z.keys())])))
246 Z[k] = v
247 Z = [(v,k) for k,v in Z.iteritems()]
248 Z.sort()
249 b = self.makeBars()
250 bl = b.contents.pop(-1)
251 for v,k in Z:
252 if k=='background':
253 g.add(self.makeBackground())
254 elif k=='categoryAxis':
255 g.add(cA)
256 elif k=='categoryAxisGrid':
257 cA.makeGrid(g,parent=self, dim=vA.getGridDims)
258 elif k=='valueAxis':
259 g.add(vA)
260 elif k=='valueAxisGrid':
261 vA.makeGrid(g,parent=self, dim=cA.getGridDims)
262 elif k=='bars':
263 g.add(b)
264 elif k=='barLabels':
265 g.add(bl)
266 elif k=='annotations':
267 for a in getattr(self,'annotations',()): g.add(a(self,cA.scale,vA.scale))
268
208 del self._configureData269 del self._configureData
209 return g270 return g
210271
@@ -398,16 +459,16 @@
398 if text:459 if text:
399 self._addLabel(text, self.barLabels[(rowNo, colNo)], g, rowNo, colNo, x, y, width, height)460 self._addLabel(text, self.barLabels[(rowNo, colNo)], g, rowNo, colNo, x, y, width, height)
400461
401 def _addNABarLabel(self, g, rowNo, colNo, x, y, width, height):462 def _addNABarLabel(self, g, rowNo, colNo, x, y, width, height, calcOnly=False, na=None):
402 na = self.naLabel463 if na is None: na = self.naLabel
403 if na and na.text:464 if na and na.text:
404 na = copy.copy(na)465 na = copy.copy(na)
405 v = self.valueAxis._valueMax<=0 and -1e-8 or 1e-8466 v = self.valueAxis._valueMax<=0 and -1e-8 or 1e-8
406 if width is None: width = v467 if width is None: width = v
407 if height is None: height = v468 if height is None: height = v
408 self._addLabel(na.text, na, g, rowNo, colNo, x, y, width, height)469 return self._addLabel(na.text, na, g, rowNo, colNo, x, y, width, height, calcOnly=calcOnly)
409470
410 def _addLabel(self, text, label, g, rowNo, colNo, x, y, width, height):471 def _addLabel(self, text, label, g, rowNo, colNo, x, y, width, height, calcOnly=False):
411 if label.visible:472 if label.visible:
412 labelWidth = stringWidth(text, label.fontName, label.fontSize)473 labelWidth = stringWidth(text, label.fontName, label.fontSize)
413 flipXY = self._flipXY474 flipXY = self._flipXY
@@ -447,6 +508,7 @@
447 dx = 0508 dx = 0
448 else:509 else:
449 dy = dx = 0510 dy = dx = 0
511 if calcOnly: return x0+dx, y0+dy
450 label.setOrigin(x0+dx, y0+dy)512 label.setOrigin(x0+dx, y0+dy)
451 label.setText(text)513 label.setText(text)
452 sC, sW = label.lineStrokeColor, label.lineStrokeWidth514 sC, sW = label.lineStrokeColor, label.lineStrokeWidth
@@ -471,16 +533,41 @@
471 lenData = len(self.data)533 lenData = len(self.data)
472 bars = self.bars534 bars = self.bars
473 br = getattr(self,'barRecord',None)535 br = getattr(self,'barRecord',None)
536 BP = self._barPositions
537
538 catNAL = self.categoryNALabel
539 catNNA = {}
540 if catNAL:
541 CBL = []
542 rowNoL = lenData - 1
543 #find all the categories that have at least one value
544 for rowNo in xrange(lenData):
545 row = BP[rowNo]
546 for colNo in xrange(len(row)):
547 x, y, width, height = row[colNo]
548 if None not in (width,height):
549 catNNA[colNo] = 1
550
474 for rowNo in xrange(lenData):551 for rowNo in xrange(lenData):
475 row = self._barPositions[rowNo]552 row = BP[rowNo]
476 styleCount = len(bars)553 styleCount = len(bars)
477 styleIdx = rowNo % styleCount554 styleIdx = rowNo % styleCount
478 rowStyle = bars[styleIdx]555 rowStyle = bars[styleIdx]
479 for colNo in range(len(row)):556 for colNo in xrange(len(row)):
480 style = (styleIdx,colNo) in bars and bars[(styleIdx,colNo)] or rowStyle557 style = (styleIdx,colNo) in bars and bars[(styleIdx,colNo)] or rowStyle
481 (x, y, width, height) = row[colNo]558 x, y, width, height = row[colNo]
482 if None in (width,height):559 if None in (width,height):
483 self._addNABarLabel(lg,rowNo,colNo,x,y,width,height)560 if colNo in catNNA:
561 self._addNABarLabel(lg,rowNo,colNo,x,y,width,height)
562 elif catNAL and colNo not in CBL:
563 r0 = self._addNABarLabel(lg,rowNo,colNo,x,y,width,height,True,catNAL)
564 if r0:
565 x, y, width, height = BP[rowNoL][colNo]
566 r1 = self._addNABarLabel(lg,rowNoL,colNo,x,y,width,height,True,catNAL)
567 x = (r0[0]+r1[0])/2.0
568 y = (r0[1]+r1[1])/2.0
569 self._addNABarLabel(lg,rowNoL,colNo,x,y,width,height,na=catNAL)
570 CBL.append(colNo)
484 continue571 continue
485572
486 # Draw a rectangular symbol for each data item,573 # Draw a rectangular symbol for each data item,
487574
=== modified file 'src/reportlab/graphics/charts/doughnut.py'
--- src/reportlab/graphics/charts/doughnut.py 2010-12-06 12:45:44 +0000
+++ src/reportlab/graphics/charts/doughnut.py 2013-04-14 00:52:26 +0000
@@ -1,9 +1,9 @@
1#Copyright ReportLab Europe Ltd. 2000-20041#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/doughnut.py3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/doughnut.py
4# doughnut chart4# doughnut chart
55
6__version__=''' $Id: doughnut.py 3785 2010-09-28 16:41:27Z rgbecker $ '''6__version__=''' $Id: doughnut.py 3959 2012-09-27 14:39:39Z robin $ '''
7__doc__="""Doughnut chart7__doc__="""Doughnut chart
88
9Produces a circular chart like the doughnut charts produced by Excel.9Produces a circular chart like the doughnut charts produced by Excel.
@@ -27,7 +27,7 @@
27from reportlab.graphics.shapes import Group, Drawing, Line, Rect, Polygon, Ellipse, \27from reportlab.graphics.shapes import Group, Drawing, Line, Rect, Polygon, Ellipse, \
28 Wedge, String, SolidShape, UserNode, STATE_DEFAULTS28 Wedge, String, SolidShape, UserNode, STATE_DEFAULTS
29from reportlab.graphics.widgetbase import Widget, TypedPropertyCollection, PropHolder29from reportlab.graphics.widgetbase import Widget, TypedPropertyCollection, PropHolder
30from reportlab.graphics.charts.piecharts import AbstractPieChart, WedgeProperties, _addWedgeLabel30from reportlab.graphics.charts.piecharts import AbstractPieChart, WedgeProperties, _addWedgeLabel, fixLabelOverlaps
31from reportlab.graphics.charts.textlabels import Label31from reportlab.graphics.charts.textlabels import Label
32from reportlab.graphics.widgets.markers import Marker32from reportlab.graphics.widgets.markers import Marker
3333
@@ -54,6 +54,9 @@
54 direction = AttrMapValue(OneOf('clockwise', 'anticlockwise'), desc="'clockwise' or 'anticlockwise'"),54 direction = AttrMapValue(OneOf('clockwise', 'anticlockwise'), desc="'clockwise' or 'anticlockwise'"),
55 slices = AttrMapValue(None, desc="collection of sector descriptor objects"),55 slices = AttrMapValue(None, desc="collection of sector descriptor objects"),
56 simpleLabels = AttrMapValue(isBoolean, desc="If true(default) use String not super duper WedgeLabel"),56 simpleLabels = AttrMapValue(isBoolean, desc="If true(default) use String not super duper WedgeLabel"),
57 # advanced usage
58 checkLabelOverlap = AttrMapValue(isBoolean, desc="If true check and attempt to fix\n standard label overlaps(default off)",advancedUsage=1),
59 sideLabels = AttrMapValue(isBoolean, desc="If true attempt to make chart with labels along side and pointers", advancedUsage=1)
57 )60 )
5861
59 def __init__(self):62 def __init__(self):
@@ -66,13 +69,19 @@
66 self.startAngle = 9069 self.startAngle = 90
67 self.direction = "clockwise"70 self.direction = "clockwise"
68 self.simpleLabels = 171 self.simpleLabels = 1
72 self.checkLabelOverlap = 0
73 self.sideLabels = 0
6974
70 self.slices = TypedPropertyCollection(SectorProperties)75 self.slices = TypedPropertyCollection(SectorProperties)
71 self.slices[0].fillColor = colors.darkcyan76 self.slices[0].fillColor = colors.darkcyan
72 self.slices[1].fillColor = colors.blueviolet77 self.slices[1].fillColor = colors.blueviolet
73 self.slices[2].fillColor = colors.blue78 self.slices[2].fillColor = colors.blue
74 self.slices[3].fillColor = colors.cyan79 self.slices[3].fillColor = colors.cyan
7580 self.slices[4].fillColor = colors.pink
81 self.slices[5].fillColor = colors.magenta
82 self.slices[6].fillColor = colors.yellow
83
84
76 def demo(self):85 def demo(self):
77 d = Drawing(200, 100)86 d = Drawing(200, 100)
7887
@@ -121,8 +130,12 @@
121 normData = self.normalizeData(self.data)130 normData = self.normalizeData(self.data)
122 n = len(normData)131 n = len(normData)
123 self._seriesCount = n132 self._seriesCount = n
124133
125 #labels134 #labels
135 checkLabelOverlap = self.checkLabelOverlap
136 L = []
137 L_add = L.append
138
126 if self.labels is None:139 if self.labels is None:
127 labels = []140 labels = []
128 if type(n) not in (ListType,TupleType):141 if type(n) not in (ListType,TupleType):
@@ -157,7 +170,7 @@
157 whichWay = -1170 whichWay = -1
158171
159 g = Group()172 g = Group()
160173
161 startAngle = self.startAngle #% 360174 startAngle = self.startAngle #% 360
162 styleCount = len(self.slices)175 styleCount = len(self.slices)
163 if type(self.data[0]) in (ListType, TupleType):176 if type(self.data[0]) in (ListType, TupleType):
@@ -203,14 +216,23 @@
203216
204 g.add(theSector)217 g.add(theSector)
205218
206 text = self.getSeriesName(i,'')219 if sn == 0:
207 if text:220 text = self.getSeriesName(i,'')
208 averageAngle = (a1+a2)/2.0221 if text:
209 aveAngleRadians = averageAngle*pi/180.0222 averageAngle = (a1+a2)/2.0
210 labelRadius = sectorStyle.labelRadius223 aveAngleRadians = averageAngle*pi/180.0
211 labelX = centerx + (0.5 * self.width * cos(aveAngleRadians) * labelRadius)224 labelRadius = sectorStyle.labelRadius
212 labelY = centery + (0.5 * self.height * sin(aveAngleRadians) * labelRadius)225 rx = xradius*labelRadius
213 g.add(_addWedgeLabel(self,text,averageAngle,labelX,labelY,sectorStyle))226 ry = yradius*labelRadius
227 labelX = centerx + (0.5 * self.width * cos(aveAngleRadians) * labelRadius)
228 labelY = centery + (0.5 * self.height * sin(aveAngleRadians) * labelRadius)
229 l = _addWedgeLabel(self,text,averageAngle,labelX,labelY,sectorStyle)
230 if checkLabelOverlap:
231 l._origdata = { 'x': labelX, 'y':labelY, 'angle': averageAngle,
232 'rx': rx, 'ry':ry, 'cx':cx, 'cy':cy,
233 'bounds': l.getBounds(),
234 }
235 L_add(l)
214236
215 else:237 else:
216 #single series doughnut238 #single series doughnut
@@ -261,18 +283,23 @@
261 labelRadius = sectorStyle.labelRadius283 labelRadius = sectorStyle.labelRadius
262 labelX = centerx + (0.5 * self.width * cos(aveAngleRadians) * labelRadius)284 labelX = centerx + (0.5 * self.width * cos(aveAngleRadians) * labelRadius)
263 labelY = centery + (0.5 * self.height * sin(aveAngleRadians) * labelRadius)285 labelY = centery + (0.5 * self.height * sin(aveAngleRadians) * labelRadius)
264286 rx = xradius*labelRadius
265 theLabel = String(labelX, labelY, labels[i])287 ry = yradius*labelRadius
266 theLabel.textAnchor = "middle"288 l = _addWedgeLabel(self,labels[i],averageAngle,labelX,labelY,sectorStyle)
267 theLabel.fontSize = sectorStyle.fontSize289 if checkLabelOverlap:
268 theLabel.fontName = sectorStyle.fontName290 l._origdata = { 'x': labelX, 'y':labelY, 'angle': averageAngle,
269 theLabel.fillColor = sectorStyle.fontColor291 'rx': rx, 'ry':ry, 'cx':cx, 'cy':cy,
270292 'bounds': l.getBounds(),
271 g.add(theLabel)293 }
272294 L_add(l)
273295
296 if checkLabelOverlap and L:
297 fixLabelOverlaps(L)
298
299 for l in L: g.add(l)
300
274 return g301 return g
275302
276 def draw(self):303 def draw(self):
277 g = Group()304 g = Group()
278 g.add(self.makeSectors())305 g.add(self.makeSectors())
@@ -336,6 +363,23 @@
336363
337 return d364 return d
338365
366def sample4():
367 "Make a more complex demo with Label Overlap fixing"
368
369 d = Drawing(400, 400)
370 dn = Doughnut()
371 dn.x = 50
372 dn.y = 50
373 dn.width = 300
374 dn.height = 300
375 dn.data = [[10,20,30,40,50,60], [10,20,30,40]]
376 dn.labels = ['a','b','c','d','e','f']
377 dn.checkLabelOverlap = True
378
379 d.add(dn)
380
381 return d
382
339if __name__=='__main__':383if __name__=='__main__':
340384
341 from reportlab.graphics.renderPDF import drawToFile385 from reportlab.graphics.renderPDF import drawToFile
342386
=== modified file 'src/reportlab/graphics/charts/legends.py'
--- src/reportlab/graphics/charts/legends.py 2010-12-06 12:45:44 +0000
+++ src/reportlab/graphics/charts/legends.py 2013-04-14 00:52:26 +0000
@@ -1,8 +1,8 @@
1#Copyright ReportLab Europe Ltd. 2000-20041#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/legends.py3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/legends.py
44
5__version__=''' $Id: legends.py 3723 2010-06-08 15:46:32Z juraj $ '''5__version__=''' $Id: legends.py 3959 2012-09-27 14:39:39Z robin $ '''
6__doc__="""This will be a collection of legends to be used with charts."""6__doc__="""This will be a collection of legends to be used with charts."""
77
8import copy, operator8import copy, operator
99
=== modified file 'src/reportlab/graphics/charts/linecharts.py'
--- src/reportlab/graphics/charts/linecharts.py 2010-12-06 12:45:44 +0000
+++ src/reportlab/graphics/charts/linecharts.py 2013-04-14 00:52:26 +0000
@@ -1,8 +1,8 @@
1#Copyright ReportLab Europe Ltd. 2000-20041#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/linecharts.py3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/linecharts.py
44
5__version__=''' $Id: linecharts.py 3662 2010-02-09 11:23:58Z rgbecker $ '''5__version__=''' $Id: linecharts.py 3959 2012-09-27 14:39:39Z robin $ '''
6__doc__="""This modules defines a very preliminary Line Chart example."""6__doc__="""This modules defines a very preliminary Line Chart example."""
77
8from reportlab.lib import colors8from reportlab.lib import colors
99
=== modified file 'src/reportlab/graphics/charts/lineplots.py'
--- src/reportlab/graphics/charts/lineplots.py 2010-12-06 12:45:44 +0000
+++ src/reportlab/graphics/charts/lineplots.py 2013-04-14 00:52:26 +0000
@@ -1,8 +1,8 @@
1#Copyright ReportLab Europe Ltd. 2000-20041#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/lineplots.py3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/lineplots.py
44
5__version__=''' $Id: lineplots.py 3735 2010-07-01 12:24:52Z rgbecker $ '''5__version__=''' $Id: lineplots.py 3959 2012-09-27 14:39:39Z robin $ '''
6__doc__="""This module defines a very preliminary Line Plot example."""6__doc__="""This module defines a very preliminary Line Plot example."""
77
8import string, time8import string, time
@@ -213,7 +213,10 @@
213 else:213 else:
214 labelText = labelFmt % labelValue214 labelText = labelFmt % labelValue
215 elif hasattr(labelFmt,'__call__'):215 elif hasattr(labelFmt,'__call__'):
216 labelText = labelFmt(labelValue)216 if not hasattr(labelFmt,'__labelFmtEX__'):
217 labelText = labelFmt(labelValue)
218 else:
219 labelText = labelFmt(self,rowNo,colNo,x,y)
217 else:220 else:
218 raise ValueError("Unknown formatter type %s, expected string or function"%labelFmt)221 raise ValueError("Unknown formatter type %s, expected string or function"%labelFmt)
219222
@@ -298,10 +301,18 @@
298 uSymbol = None301 uSymbol = None
299302
300 if uSymbol:303 if uSymbol:
301 j = -1304 if bubblePlot: drow = self.data[rowNo]
302 if bubblePlot: drow = self.data[rowNo]305 for j,xy in enumerate(row):
303 for xy in row:306 symbol = uSymbol2Symbol(uSymbol,xy[0],xy[1],rowColor)
304 j += 1307 if symbol:
308 if bubblePlot:
309 symbol.size = bubbleR*(drow[j][2]/bubbleMax)**0.5
310 g.add(symbol)
311 else:
312 if bubblePlot: drow = self.data[rowNo]
313 for j,xy in enumerate(row):
314 usymbol = getattr(self.lines[rowNo,j],'symbol',None)
315 if not usymbol: continue
305 symbol = uSymbol2Symbol(uSymbol,xy[0],xy[1],rowColor)316 symbol = uSymbol2Symbol(uSymbol,xy[0],xy[1],rowColor)
306 if symbol:317 if symbol:
307 if bubblePlot:318 if bubblePlot:
@@ -348,13 +359,27 @@
348 if self.behindAxes:359 if self.behindAxes:
349 self._lineG = Group()360 self._lineG = Group()
350 g.add(self._lineG)361 g.add(self._lineG)
362 xA._joinToAxis()
363 yA._joinToAxis()
364 xAex = xA.visibleAxis and [xA._y] or []
365 yAex = yA.visibleAxis and [yA._x] or []
366 skipGrid = getattr(xA,'skipGrid','none')
367 if skipGrid!=None:
368 if skipGrid in ('both','top'):
369 yAex.append(xA._x+xA._length)
370 if skipGrid in ('both','bottom'):
371 yAex.append(xA._x)
372 skipGrid = getattr(yA,'skipGrid','none')
373 if skipGrid!=None:
374 if skipGrid in ('both','top'):
375 xAex.append(yA._y+yA._length)
376 if skipGrid in ('both','bottom'):
377 xAex.append(yA._y)
351 if self.gridFirst:378 if self.gridFirst:
352 xA.makeGrid(g,parent=self,dim=yA.getGridDims)379 xA.makeGrid(g,parent=self,dim=yA.getGridDims,exclude=yAex)
353 yA.makeGrid(g,parent=self,dim=xA.getGridDims)380 yA.makeGrid(g,parent=self,dim=xA.getGridDims,exclude=xAex)
354 g.add(xA.draw())381 g.add(xA.draw())
355 g.add(yA.draw())382 g.add(yA.draw())
356 xAex = xA.visibleAxis and (xA._y,) or ()
357 yAex = yA.visibleAxis and (yA._x,) or ()
358 if not self.gridFirst:383 if not self.gridFirst:
359 xAdgl = getattr(xA,'drawGridLast',False)384 xAdgl = getattr(xA,'drawGridLast',False)
360 yAdgl = getattr(yA,'drawGridLast',False)385 yAdgl = getattr(yA,'drawGridLast',False)
@@ -801,7 +826,6 @@
801 height = AttrMapValue(isNumber, desc="Height of the area inside the axes"),826 height = AttrMapValue(isNumber, desc="Height of the area inside the axes"),
802 outerBorderOn = AttrMapValue(isBoolean, desc="Is there an outer border (continuation of axes)"),827 outerBorderOn = AttrMapValue(isBoolean, desc="Is there an outer border (continuation of axes)"),
803 outerBorderColor = AttrMapValue(isColorOrNone, desc="Color of outer border (if any)"),828 outerBorderColor = AttrMapValue(isColorOrNone, desc="Color of outer border (if any)"),
804 background = AttrMapValue(isColorOrNone, desc="Background color (if any)"),
805 labelOffset = AttrMapValue(isNumber, desc="Space between label and Axis (or other labels)",advancedUsage=1),829 labelOffset = AttrMapValue(isNumber, desc="Space between label and Axis (or other labels)",advancedUsage=1),
806 axisTickLengths = AttrMapValue(isNumber, desc="Lenth of the ticks on both axes"),830 axisTickLengths = AttrMapValue(isNumber, desc="Lenth of the ticks on both axes"),
807 axisStrokeWidth = AttrMapValue(isNumber, desc="Stroke width for both axes"),831 axisStrokeWidth = AttrMapValue(isNumber, desc="Stroke width for both axes"),
@@ -853,7 +877,6 @@
853877
854 #values for lineplot878 #values for lineplot
855 self.joinedLines = 0879 self.joinedLines = 0
856 self.fillColor = self.background
857880
858 self.leftPadding=5881 self.leftPadding=5
859 self.rightPadding=10882 self.rightPadding=10
860883
=== modified file 'src/reportlab/graphics/charts/markers.py'
--- src/reportlab/graphics/charts/markers.py 2009-02-22 14:19:44 +0000
+++ src/reportlab/graphics/charts/markers.py 2013-04-14 00:52:26 +0000
@@ -1,8 +1,8 @@
1#Copyright ReportLab Europe Ltd. 2000-20041#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/markers.py3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/markers.py
44
5__version__=''' $Id: markers.py 3345 2008-12-12 17:55:22Z damian $ '''5__version__=''' $Id: markers.py 3959 2012-09-27 14:39:39Z robin $ '''
6__doc__="""This modules defines a collection of markers used in charts.6__doc__="""This modules defines a collection of markers used in charts.
77
8The make* functions return a simple shape or a widget as for8The make* functions return a simple shape or a widget as for
99
=== modified file 'src/reportlab/graphics/charts/piecharts.py'
--- src/reportlab/graphics/charts/piecharts.py 2010-12-06 12:45:44 +0000
+++ src/reportlab/graphics/charts/piecharts.py 2013-04-14 00:52:26 +0000
@@ -1,4 +1,4 @@
1#Copyright ReportLab Europe Ltd. 2000-20041#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/piecharts.py3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/piecharts.py
4# experimental pie chart script. Two types of pie - one is a monolithic4# experimental pie chart script. Two types of pie - one is a monolithic
@@ -6,7 +6,7 @@
6#a wedges collection whic lets you customize the group or every individual6#a wedges collection whic lets you customize the group or every individual
7#wedge.7#wedge.
88
9__version__=''' $Id: piecharts.py 3744 2010-07-19 10:48:38Z rgbecker $ '''9__version__=''' $Id: piecharts.py 3959 2012-09-27 14:39:39Z robin $ '''
10__doc__="""Basic Pie Chart class.10__doc__="""Basic Pie Chart class.
1111
12This permits you to customize and pop out individual wedges;12This permits you to customize and pop out individual wedges;
@@ -31,10 +31,14 @@
31from reportlab.graphics.widgetbase import Widget, TypedPropertyCollection, PropHolder31from reportlab.graphics.widgetbase import Widget, TypedPropertyCollection, PropHolder
32from reportlab.graphics.charts.areas import PlotArea32from reportlab.graphics.charts.areas import PlotArea
33from reportlab.graphics.charts.legends import _objStr33from reportlab.graphics.charts.legends import _objStr
34from textlabels import Label34from reportlab.graphics.charts.textlabels import Label
3535
36_ANGLE2BOXANCHOR={0:'w', 45:'sw', 90:'s', 135:'se', 180:'e', 225:'ne', 270:'n', 315: 'nw', -45: 'nw'}36_ANGLE2BOXANCHOR={0:'w', 45:'sw', 90:'s', 135:'se', 180:'e', 225:'ne', 270:'n', 315: 'nw', -45: 'nw'}
37_ANGLE2RBOXANCHOR={0:'e', 45:'ne', 90:'n', 135:'nw', 180:'w', 225:'sw', 270:'s', 315: 'se', -45: 'se'}37_ANGLE2RBOXANCHOR={0:'e', 45:'ne', 90:'n', 135:'nw', 180:'w', 225:'sw', 270:'s', 315: 'se', -45: 'se'}
38
39_ANGLELO = 1e-7
40_ANGLEHI = 360.0 - _ANGLELO
41
38class WedgeLabel(Label):42class WedgeLabel(Label):
39 def _checkDXY(self,ba):43 def _checkDXY(self,ba):
40 pass44 pass
@@ -59,46 +63,46 @@
59 format method.63 format method.
60 """64 """
61 _attrMap = AttrMap(65 _attrMap = AttrMap(
62 strokeWidth = AttrMapValue(isNumber,desc=''),66 strokeWidth = AttrMapValue(isNumber,desc='Width of the wedge border'),
63 fillColor = AttrMapValue(isColorOrNone,desc=''),67 fillColor = AttrMapValue(isColorOrNone,desc='Filling color of the wedge'),
64 strokeColor = AttrMapValue(isColorOrNone,desc=''),68 strokeColor = AttrMapValue(isColorOrNone,desc='Color of the wedge border'),
65 strokeDashArray = AttrMapValue(isListOfNumbersOrNone,desc=''),69 strokeDashArray = AttrMapValue(isListOfNumbersOrNone,desc='Style of the wedge border, expressed as a list of lengths of alternating dashes and blanks'),
66 strokeLineCap = AttrMapValue(OneOf(0,1,2),desc="Line cap 0=butt, 1=round & 2=square"),70 strokeLineCap = AttrMapValue(OneOf(0,1,2),desc="Line cap 0=butt, 1=round & 2=square"),
67 strokeLineJoin = AttrMapValue(OneOf(0,1,2),desc="Line join 0=miter, 1=round & 2=bevel"),71 strokeLineJoin = AttrMapValue(OneOf(0,1,2),desc="Line join 0=miter, 1=round & 2=bevel"),
68 strokeMiterLimit = AttrMapValue(isNumber,desc='miter limit control miter line joins'),72 strokeMiterLimit = AttrMapValue(isNumber,desc='Miter limit control miter line joins'),
69 popout = AttrMapValue(isNumber,desc="how far of centre a wedge to pop."),73 popout = AttrMapValue(isNumber,desc="How far of centre a wedge to pop"),
70 fontName = AttrMapValue(isString,desc=''),74 fontName = AttrMapValue(isString,desc='Name of the font of the label text'),
71 fontSize = AttrMapValue(isNumber,desc=''),75 fontSize = AttrMapValue(isNumber,desc='Size of the font of the label text in points'),
72 fontColor = AttrMapValue(isColorOrNone,desc=''),76 fontColor = AttrMapValue(isColorOrNone,desc='Color of the font of the label text'),
73 labelRadius = AttrMapValue(isNumber,desc=''),77 labelRadius = AttrMapValue(isNumber,desc='Distance between the center of the label box and the center of the pie, expressed in times the radius of the pie'),
74 label_dx = AttrMapValue(isNumber,desc=''),78 label_dx = AttrMapValue(isNumber,desc='X Offset of the label'),
75 label_dy = AttrMapValue(isNumber,desc=''),79 label_dy = AttrMapValue(isNumber,desc='Y Offset of the label'),
76 label_angle = AttrMapValue(isNumber,desc=''),80 label_angle = AttrMapValue(isNumber,desc='Angle of the label, default (0) is horizontal, 90 is vertical, 180 is upside down'),
77 label_boxAnchor = AttrMapValue(isBoxAnchor,desc=''),81 label_boxAnchor = AttrMapValue(isBoxAnchor,desc='Anchoring point of the label'),
78 label_boxStrokeColor = AttrMapValue(isColorOrNone,desc=''),82 label_boxStrokeColor = AttrMapValue(isColorOrNone,desc='Border color for the label box'),
79 label_boxStrokeWidth = AttrMapValue(isNumber,desc=''),83 label_boxStrokeWidth = AttrMapValue(isNumber,desc='Border width for the label box'),
80 label_boxFillColor = AttrMapValue(isColorOrNone,desc=''),84 label_boxFillColor = AttrMapValue(isColorOrNone,desc='Filling color of the label box'),
81 label_strokeColor = AttrMapValue(isColorOrNone,desc=''),85 label_strokeColor = AttrMapValue(isColorOrNone,desc='Border color for the label text'),
82 label_strokeWidth = AttrMapValue(isNumber,desc=''),86 label_strokeWidth = AttrMapValue(isNumber,desc='Border width for the label text'),
83 label_text = AttrMapValue(isStringOrNone,desc=''),87 label_text = AttrMapValue(isStringOrNone,desc='Text of the label'),
84 label_leading = AttrMapValue(isNumberOrNone,desc=''),88 label_leading = AttrMapValue(isNumberOrNone,desc=''),
85 label_width = AttrMapValue(isNumberOrNone,desc=''),89 label_width = AttrMapValue(isNumberOrNone,desc='Width of the label'),
86 label_maxWidth = AttrMapValue(isNumberOrNone,desc=''),90 label_maxWidth = AttrMapValue(isNumberOrNone,desc='Maximum width the label can grow to'),
87 label_height = AttrMapValue(isNumberOrNone,desc=''),91 label_height = AttrMapValue(isNumberOrNone,desc='Height of the label'),
88 label_textAnchor = AttrMapValue(isTextAnchor,desc=''),92 label_textAnchor = AttrMapValue(isTextAnchor,desc='Maximum height the label can grow to'),
89 label_visible = AttrMapValue(isBoolean,desc="True if the label is to be drawn"),93 label_visible = AttrMapValue(isBoolean,desc="True if the label is to be drawn"),
90 label_topPadding = AttrMapValue(isNumber,'padding at top of box'),94 label_topPadding = AttrMapValue(isNumber,'Padding at top of box'),
91 label_leftPadding = AttrMapValue(isNumber,'padding at left of box'),95 label_leftPadding = AttrMapValue(isNumber,'Padding at left of box'),
92 label_rightPadding = AttrMapValue(isNumber,'padding at right of box'),96 label_rightPadding = AttrMapValue(isNumber,'Padding at right of box'),
93 label_bottomPadding = AttrMapValue(isNumber,'padding at bottom of box'),97 label_bottomPadding = AttrMapValue(isNumber,'Padding at bottom of box'),
94 label_simple_pointer = AttrMapValue(isBoolean,'set to True for simple pointers'),98 label_simple_pointer = AttrMapValue(isBoolean,'Set to True for simple pointers'),
95 label_pointer_strokeColor = AttrMapValue(isColorOrNone,desc='Color of indicator line'),99 label_pointer_strokeColor = AttrMapValue(isColorOrNone,desc='Color of indicator line'),
96 label_pointer_strokeWidth = AttrMapValue(isNumber,desc='StrokeWidth of indicator line'),100 label_pointer_strokeWidth = AttrMapValue(isNumber,desc='StrokeWidth of indicator line'),
97 label_pointer_elbowLength = AttrMapValue(isNumber,desc='length of final indicator line segment'),101 label_pointer_elbowLength = AttrMapValue(isNumber,desc='Length of final indicator line segment'),
98 label_pointer_edgePad = AttrMapValue(isNumber,desc='pad between pointer label and box'),102 label_pointer_edgePad = AttrMapValue(isNumber,desc='pad between pointer label and box'),
99 label_pointer_piePad = AttrMapValue(isNumber,desc='pad between pointer label and pie'),103 label_pointer_piePad = AttrMapValue(isNumber,desc='pad between pointer label and pie'),
100 swatchMarker = AttrMapValue(NoneOr(isSymbol), desc="None or makeMarker('Diamond') ...",advancedUsage=1),104 swatchMarker = AttrMapValue(NoneOr(isSymbol), desc="None or makeMarker('Diamond') ...",advancedUsage=1),
101 visible = AttrMapValue(isBoolean,'set to false to skip displaying'),105 visible = AttrMapValue(isBoolean,'Set to false to skip displaying'),
102 )106 )
103107
104 def __init__(self):108 def __init__(self):
@@ -138,7 +142,13 @@
138 # now draw a label142 # now draw a label
139 if self.simpleLabels:143 if self.simpleLabels:
140 theLabel = String(labelX, labelY, text)144 theLabel = String(labelX, labelY, text)
141 theLabel.textAnchor = "middle"145 if not self.sideLabels:
146 theLabel.textAnchor = "middle"
147 else:
148 if (abs(angle) < 90 ) or (angle >270 and angle<450) or (-450< angle <-270):
149 theLabel.textAnchor = "start"
150 else:
151 theLabel.textAnchor = "end"
142 theLabel._pmv = angle152 theLabel._pmv = angle
143 theLabel._simple_pointer = 0153 theLabel._simple_pointer = 0
144 else:154 else:
@@ -147,9 +157,23 @@
147 theLabel.x = labelX157 theLabel.x = labelX
148 theLabel.y = labelY158 theLabel.y = labelY
149 theLabel.dx = wedgeStyle.label_dx159 theLabel.dx = wedgeStyle.label_dx
150 theLabel.dy = wedgeStyle.label_dy160 if not self.sideLabels:
161 theLabel.dy = wedgeStyle.label_dy
162 theLabel.boxAnchor = wedgeStyle.label_boxAnchor
163 else:
164 if wedgeStyle.fontSize is None:
165 sideLabels_dy = self.fontSize / 2.5
166 else:
167 sideLabels_dy = wedgeStyle.fontSize / 2.5
168 if wedgeStyle.label_dy is None:
169 theLabel.dy = sideLabels_dy
170 else:
171 theLabel.dy = wedgeStyle.label_dy + sideLabels_dy
172 if (abs(angle) < 90 ) or (angle >270 and angle<450) or (-450< angle <-270):
173 theLabel.boxAnchor = 'w'
174 else:
175 theLabel.boxAnchor = 'e'
151 theLabel.angle = wedgeStyle.label_angle176 theLabel.angle = wedgeStyle.label_angle
152 theLabel.boxAnchor = wedgeStyle.label_boxAnchor
153 theLabel.boxStrokeColor = wedgeStyle.label_boxStrokeColor177 theLabel.boxStrokeColor = wedgeStyle.label_boxStrokeColor
154 theLabel.boxStrokeWidth = wedgeStyle.label_boxStrokeWidth178 theLabel.boxStrokeWidth = wedgeStyle.label_boxStrokeWidth
155 theLabel.boxFillColor = wedgeStyle.label_boxFillColor179 theLabel.boxFillColor = wedgeStyle.label_boxFillColor
@@ -210,7 +234,7 @@
210 return text234 return text
211235
212def boundsOverlap(P,Q):236def boundsOverlap(P,Q):
213 return not(P[0]>Q[2]-1e-2 or Q[0]>P[2]-1e-2 or P[1]>Q[3]-1e-2 or Q[1]>P[3]-1e-2)237 return not(P[0]>Q[2]-1e-2 or Q[0]>P[2]-1e-2 or P[1]>(0.5*(Q[1]+Q[3]))-1e-2 or Q[1]>(0.5*(P[1]+P[3]))-1e-2)
214238
215def _findOverlapRun(B,i,wrap):239def _findOverlapRun(B,i,wrap):
216 '''find overlap run containing B[i]'''240 '''find overlap run containing B[i]'''
@@ -237,7 +261,7 @@
237 if len(R)>1: return R261 if len(R)>1: return R
238 return None262 return None
239263
240def fixLabelOverlaps(L):264def fixLabelOverlaps(L, sideLabels=False):
241 nL = len(L)265 nL = len(L)
242 if nL<2: return266 if nL<2: return
243 B = [l._origdata['bounds'] for l in L]267 B = [l._origdata['bounds'] for l in L]
@@ -246,40 +270,69 @@
246 iter = 0270 iter = 0
247 mult = 1.271 mult = 1.
248272
249 while iter<30:273 if not sideLabels:
250 R = findOverlapRun(B)274 while iter<30:
251 if not R: break275 R = findOverlapRun(B)
252 nR = len(R)276 if not R: break
253 if nR==nL: break277 nR = len(R)
254 if not [r for r in RP if r in R]:278 if nR==nL: break
255 mult = 1.0279 if not [r for r in RP if r in R]:
256 da = 0280 mult = 1.0
257 r0 = R[0]281 da = 0
258 rL = R[-1]282 r0 = R[0]
259 bi = B[r0]283 rL = R[-1]
260 taa = aa = _360(L[r0]._pmv)284 bi = B[r0]
261 for r in R[1:]:285 taa = aa = _360(L[r0]._pmv)
262 b = B[r]286 for r in R[1:]:
263 da = max(da,min(b[3]-bi[1],bi[3]-b[1]))287 b = B[r]
264 bi = b288 da = max(da,min(b[3]-bi[1],bi[3]-b[1]))
265 aa += L[r]._pmv289 bi = b
266 aa = aa/float(nR)290 aa += L[r]._pmv
267 utaa = abs(L[rL]._pmv-taa)291 aa = aa/float(nR)
268 ntaa = _360(utaa)292 utaa = abs(L[rL]._pmv-taa)
269 da *= mult*(nR-1)/ntaa293 ntaa = _360(utaa)
270294 da *= mult*(nR-1)/ntaa
271 for r in R:295
272 l = L[r]296 for r in R:
273 orig = l._origdata297 l = L[r]
274 angle = l._pmv = _360(l._pmv+da*(_360(l._pmv)-aa))298 orig = l._origdata
275 rad = angle/_180_pi299 angle = l._pmv = _360(l._pmv+da*(_360(l._pmv)-aa))
276 l.x = orig['cx'] + orig['rx']*cos(rad)300 rad = angle/_180_pi
277 l.y = orig['cy'] + orig['ry']*sin(rad)301 l.x = orig['cx'] + orig['rx']*cos(rad)
278 B[r] = l.getBounds()302 l.y = orig['cy'] + orig['ry']*sin(rad)
279 RP = R303 B[r] = l.getBounds()
280 mult *= 1.05304 RP = R
281 iter += 1305 mult *= 1.05
282306 iter += 1
307
308 else:
309 while iter<30:
310 R = findOverlapRun(B)
311 if not R: break
312 nR = len(R)
313 if nR == nL: break
314 l1 = L[-1]
315 orig1 = l1._origdata
316 bounds1 = orig1['bounds']
317 for i,r in enumerate(R):
318 l = L[r]
319 orig = l._origdata
320 bounds = orig['bounds']
321 diff1 = 0
322 diff2 = 0
323 if not i == nR-1:
324 if not bounds == bounds1:
325 if bounds[3]>bounds1[1] and bounds1[1]<bounds[1]:
326 diff1 = bounds[3]-bounds1[1]
327 if bounds1[3]>bounds[1] and bounds[1]<bounds1[1]:
328 diff2 = bounds1[3]-bounds[1]
329 if diff1 > diff2:
330 l.y +=0.5*(bounds1[3]-bounds1[1])
331 elif diff2 >= diff1:
332 l.y -= 0.5*(bounds1[3]-bounds1[1])
333 B[r] = l.getBounds()
334 iter += 1
335
283def intervalIntersection(A,B):336def intervalIntersection(A,B):
284 x,y = max(min(A),min(B)),min(max(A),max(B))337 x,y = max(min(A),min(B)),min(max(A),max(B))
285 if x>=y: return None338 if x>=y: return None
@@ -415,6 +468,31 @@
415 mul = -1468 mul = -1
416 return G, mlr[0], mlr[1], mel469 return G, mlr[0], mlr[1], mel
417470
471def theta0(data, direction):
472 fac = (2*pi)/sum(data)
473 rads = [d*fac for d in data]
474
475 r0 = 0
476 hrads = []
477 for r in rads:
478 hrads.append(r0+r*0.5)
479 r0 += r
480
481 vstar = len(data)*1e6
482 rstar = 0
483 delta = pi/36.0
484 for i in xrange(36):
485 r = i*delta
486 v = sum([abs(sin(r+a)) for a in hrads])
487 if v < vstar:
488 if direction == 'clockwise':
489 rstar=-r
490 else:
491 rstar=r
492 vstar = v
493 return rstar*180/pi
494
495
418class AngleData(float):496class AngleData(float):
419 '''use this to carry the data along with the angle'''497 '''use this to carry the data along with the angle'''
420 def __new__(cls,angle,data):498 def __new__(cls,angle,data):
@@ -424,12 +502,12 @@
424502
425class Pie(AbstractPieChart):503class Pie(AbstractPieChart):
426 _attrMap = AttrMap(BASE=AbstractPieChart,504 _attrMap = AttrMap(BASE=AbstractPieChart,
427 data = AttrMapValue(isListOfNumbers, desc='list of numbers defining wedge sizes; need not sum to 1'),505 data = AttrMapValue(isListOfNumbers, desc='List of numbers defining wedge sizes; need not sum to 1'),
428 labels = AttrMapValue(isListOfStringsOrNone, desc="optional list of labels to use for each data point"),506 labels = AttrMapValue(isListOfStringsOrNone, desc="Optional list of labels to use for each data point"),
429 startAngle = AttrMapValue(isNumber, desc="angle of first slice; like the compass, 0 is due North"),507 startAngle = AttrMapValue(isNumber, desc="Angle of first slice; 0 is due East"),
430 direction = AttrMapValue(OneOf('clockwise', 'anticlockwise'), desc="'clockwise' or 'anticlockwise'"),508 direction = AttrMapValue(OneOf('clockwise', 'anticlockwise'), desc="'clockwise' or 'anticlockwise'"),
431 slices = AttrMapValue(None, desc="collection of wedge descriptor objects"),509 slices = AttrMapValue(None, desc="Collection of wedge descriptor objects"),
432 simpleLabels = AttrMapValue(isBoolean, desc="If true(default) use String not super duper WedgeLabel",advancedUsage=1),510 simpleLabels = AttrMapValue(isBoolean, desc="If true(default) use a simple String not an advanced WedgeLabel. A WedgeLabel is customisable using the properties prefixed label_ in the collection slices."),
433 other_threshold = AttrMapValue(isNumber, desc='A value for doing threshholding, not used yet.',advancedUsage=1),511 other_threshold = AttrMapValue(isNumber, desc='A value for doing threshholding, not used yet.',advancedUsage=1),
434 checkLabelOverlap = AttrMapValue(isBoolean, desc="If true check and attempt to fix\n standard label overlaps(default off)",advancedUsage=1),512 checkLabelOverlap = AttrMapValue(isBoolean, desc="If true check and attempt to fix\n standard label overlaps(default off)",advancedUsage=1),
435 pointerLabelMode = AttrMapValue(OneOf(None,'LeftRight','LeftAndRight'), desc='',advancedUsage=1),513 pointerLabelMode = AttrMapValue(OneOf(None,'LeftRight','LeftAndRight'), desc='',advancedUsage=1),
@@ -438,6 +516,8 @@
438 xradius = AttrMapValue(isNumberOrNone, desc="X direction Radius"),516 xradius = AttrMapValue(isNumberOrNone, desc="X direction Radius"),
439 yradius = AttrMapValue(isNumberOrNone, desc="Y direction Radius"),517 yradius = AttrMapValue(isNumberOrNone, desc="Y direction Radius"),
440 wedgeRecord = AttrMapValue(None, desc="callable(wedge,*args,**kwds)",advancedUsage=1),518 wedgeRecord = AttrMapValue(None, desc="callable(wedge,*args,**kwds)",advancedUsage=1),
519 sideLabels = AttrMapValue(isBoolean, desc="If true attempt to make piechart with labels along side and pointers"),
520 sideLabelsOffset = AttrMapValue(isNumber, desc="The fraction of the pie width that the labels are situated at from the edges of the pie"),
441 )521 )
442 other_threshold=None522 other_threshold=None
443523
@@ -457,6 +537,8 @@
457 self.sameRadii = False537 self.sameRadii = False
458 self.orderMode = 'fixed'538 self.orderMode = 'fixed'
459 self.xradius = self.yradius = None539 self.xradius = self.yradius = None
540 self.sideLabels = 0
541 self.sideLabelsOffset = 0.1
460542
461 self.slices = TypedPropertyCollection(WedgeProperties)543 self.slices = TypedPropertyCollection(WedgeProperties)
462 self.slices[0].fillColor = colors.darkcyan544 self.slices[0].fillColor = colors.darkcyan
@@ -586,10 +668,14 @@
586668
587 def makeAngles(self):669 def makeAngles(self):
588 wr = getattr(self,'wedgeRecord',None)670 wr = getattr(self,'wedgeRecord',None)
589 startAngle = self.startAngle % 360671 if self.sideLabels:
672 startAngle = theta0(self.data, self.direction)
673 self.slices.label_visible = 1
674 else:
675 startAngle = self.startAngle % 360
590 whichWay = self.direction == "clockwise" and -1 or 1676 whichWay = self.direction == "clockwise" and -1 or 1
591 D = [a for a in enumerate(self.normalizeData(keepData=wr))]677 D = [a for a in enumerate(self.normalizeData(keepData=wr))]
592 if self.orderMode=='alternate':678 if self.orderMode=='alternate' and not self.sideLabels:
593 W = [a for a in D if abs(a[1])>=1e-5]679 W = [a for a in D if abs(a[1])>=1e-5]
594 W.sort(_arcCF)680 W.sort(_arcCF)
595 T = [[],[]]681 T = [[],[]]
@@ -608,7 +694,7 @@
608 a = A.append694 a = A.append
609 for i, angle in D:695 for i, angle in D:
610 endAngle = (startAngle + (angle * whichWay))696 endAngle = (startAngle + (angle * whichWay))
611 if abs(angle)>=1e-5:697 if abs(angle)>=_ANGLELO:
612 if startAngle >= endAngle:698 if startAngle >= endAngle:
613 aa = endAngle,startAngle699 aa = endAngle,startAngle
614 else:700 else:
@@ -623,6 +709,15 @@
623709
624 def makeWedges(self):710 def makeWedges(self):
625 angles = self.makeAngles()711 angles = self.makeAngles()
712 #Checking to see whether there are too many wedges packed in too small a space
713 halfAngles = []
714 for i,(a1,a2) in angles:
715 if a2 is None:
716 halfAngle = a1
717 else:
718 halfAngle = 0.5*(a2+a1)
719 halfAngles.append(halfAngle)
720 sideLabels = self.sideLabels
626 n = len(angles)721 n = len(angles)
627 labels = _fixLabels(self.labels,n)722 labels = _fixLabels(self.labels,n)
628 wr = getattr(self,'wedgeRecord',None)723 wr = getattr(self,'wedgeRecord',None)
@@ -631,6 +726,8 @@
631 styleCount = len(self.slices)726 styleCount = len(self.slices)
632727
633 plMode = self.pointerLabelMode728 plMode = self.pointerLabelMode
729 if sideLabels:
730 plMode = None
634 if plMode:731 if plMode:
635 checkLabelOverlap = False732 checkLabelOverlap = False
636 PL=self.makePointerLabels(angles,plMode)733 PL=self.makePointerLabels(angles,plMode)
@@ -662,6 +759,7 @@
662 #all having the default style759 #all having the default style
663 wedgeStyle = self.slices[i%styleCount]760 wedgeStyle = self.slices[i%styleCount]
664 if not wedgeStyle.visible: continue761 if not wedgeStyle.visible: continue
762 aa = abs(a2-a1)
665763
666 # is it a popout?764 # is it a popout?
667 cx, cy = centerx, centery765 cx, cy = centerx, centery
@@ -672,15 +770,15 @@
672 aveAngleRadians = averageAngle/_180_pi770 aveAngleRadians = averageAngle/_180_pi
673 cosAA = cos(aveAngleRadians)771 cosAA = cos(aveAngleRadians)
674 sinAA = sin(aveAngleRadians)772 sinAA = sin(aveAngleRadians)
675 if popout:773 if popout and aa<_ANGLEHI:
676 # pop out the wedge774 # pop out the wedge
677 cx = centerx + popout*cosAA775 cx = centerx + popout*cosAA
678 cy = centery + popout*sinAA776 cy = centery + popout*sinAA
679777
680 if n > 1:778 if aa>=_ANGLEHI:
779 theWedge = Ellipse(cx, cy, xradius, yradius)
780 else:
681 theWedge = Wedge(cx, cy, xradius, a1, a2, yradius=yradius)781 theWedge = Wedge(cx, cy, xradius, a1, a2, yradius=yradius)
682 elif n==1:
683 theWedge = Ellipse(cx, cy, xradius, yradius)
684782
685 theWedge.fillColor = wedgeStyle.fillColor783 theWedge.fillColor = wedgeStyle.fillColor
686 theWedge.strokeColor = wedgeStyle.strokeColor784 theWedge.strokeColor = wedgeStyle.strokeColor
@@ -695,48 +793,101 @@
695 if wr:793 if wr:
696 wr(theWedge,value=a1._data,label=text)794 wr(theWedge,value=a1._data,label=text)
697 if wedgeStyle.label_visible:795 if wedgeStyle.label_visible:
698 if text:796 if not sideLabels:
699 labelRadius = wedgeStyle.labelRadius797 if text:
700 rx = xradius*labelRadius798 labelRadius = wedgeStyle.labelRadius
701 ry = yradius*labelRadius799 rx = xradius*labelRadius
702 labelX = cx + rx*cosAA800 ry = yradius*labelRadius
703 labelY = cy + ry*sinAA801 labelX = cx + rx*cosAA
704 l = _addWedgeLabel(self,text,averageAngle,labelX,labelY,wedgeStyle)802 labelY = cy + ry*sinAA
705 L_add(l)803 l = _addWedgeLabel(self,text,averageAngle,labelX,labelY,wedgeStyle)
706 if not plMode and l._simple_pointer:804 L_add(l)
707 l._aax = cx+xradius*cosAA805 if not plMode and l._simple_pointer:
708 l._aay = cy+yradius*sinAA806 l._aax = cx+xradius*cosAA
709 if checkLabelOverlap:807 l._aay = cy+yradius*sinAA
710 l._origdata = { 'x': labelX, 'y':labelY, 'angle': averageAngle,808 if checkLabelOverlap:
711 'rx': rx, 'ry':ry, 'cx':cx, 'cy':cy,809 l._origdata = { 'x': labelX, 'y':labelY, 'angle': averageAngle,
712 'bounds': l.getBounds(),810 'rx': rx, 'ry':ry, 'cx':cx, 'cy':cy,
713 }811 'bounds': l.getBounds(),
714 elif plMode and PL_data:812 }
715 l = PL_data[i]813 elif plMode and PL_data:
716 if l:814 l = PL_data[i]
717 data = l._origdata815 if l:
718 sinM = data['smid']816 data = l._origdata
719 cosM = data['cmid']817 sinM = data['smid']
720 lX = cx + xradius*cosM818 cosM = data['cmid']
721 lY = cy + yradius*sinM819 lX = cx + xradius*cosM
722 lpel = wedgeStyle.label_pointer_elbowLength820 lY = cy + yradius*sinM
723 lXi = lX + lpel*cosM821 lpel = wedgeStyle.label_pointer_elbowLength
724 lYi = lY + lpel*sinM822 lXi = lX + lpel*cosM
725 L_add(PolyLine((lX,lY,lXi,lYi,l.x,l.y),823 lYi = lY + lpel*sinM
726 strokeWidth=wedgeStyle.label_pointer_strokeWidth,824 L_add(PolyLine((lX,lY,lXi,lYi,l.x,l.y),
727 strokeColor=wedgeStyle.label_pointer_strokeColor))825 strokeWidth=wedgeStyle.label_pointer_strokeWidth,
728 L_add(l)826 strokeColor=wedgeStyle.label_pointer_strokeColor))
729827 L_add(l)
828 else:
829 if text:
830 slices_popout = self.slices.popout
831 m=0
832 for n, angle in angles:
833 if self.slices[n].fillColor:
834 m += 1
835 else:
836 r = n%m
837 self.slices[n].fillColor = self.slices[r].fillColor
838 self.slices[n].popout = self.slices[r].popout
839 for j in range(0,m-1):
840 if self.slices[j].popout > slices_popout:
841 slices_popout = self.slices[j].popout
842 labelRadius = wedgeStyle.labelRadius
843 ry = yradius*labelRadius
844 if (abs(averageAngle) < 90 ) or (averageAngle >270 and averageAngle <450) or (-450<
845 averageAngle <-270):
846 labelX = (1+self.sideLabelsOffset)*self.width + self.x + slices_popout
847 rx = 0
848 else:
849 labelX = self.x - (self.sideLabelsOffset)*self.width - slices_popout
850 rx = 0
851 labelY = cy + ry*sinAA
852 l = _addWedgeLabel(self,text,averageAngle,labelX,labelY,wedgeStyle)
853 L_add(l)
854 if not plMode:
855 l._aax = cx+xradius*cosAA
856 l._aay = cy+yradius*sinAA
857 if checkLabelOverlap:
858 l._origdata = { 'x': labelX, 'y':labelY, 'angle': averageAngle,
859 'rx': rx, 'ry':ry, 'cx':cx, 'cy':cy,
860 'bounds': l.getBounds(),
861 }
862 x1,y1,x2,y2 = l.getBounds()
863
730 if checkLabelOverlap and L:864 if checkLabelOverlap and L:
731 fixLabelOverlaps(L)865 fixLabelOverlaps(L, sideLabels)
732 for l in L: g_add(l)866 for l in L: g_add(l)
733867
734 if not plMode:868 if not plMode:
735 for l in L:869 for l in L:
736 if l._simple_pointer:870 if l._simple_pointer and not sideLabels:
737 g_add(Line(l.x,l.y,l._aax,l._aay,871 g_add(Line(l.x,l.y,l._aax,l._aay,
738 strokeWidth=wedgeStyle.label_pointer_strokeWidth,872 strokeWidth=wedgeStyle.label_pointer_strokeWidth,
739 strokeColor=wedgeStyle.label_pointer_strokeColor))873 strokeColor=wedgeStyle.label_pointer_strokeColor))
874 elif sideLabels:
875 x1,y1,x2,y2 = l.getBounds()
876 #add pointers
877 if l.x == (1+self.sideLabelsOffset)*self.width + self.x:
878 g_add(Line(l._aax,l._aay,0.5*(l._aax+l.x),l.y+(0.25*(y2-y1)),
879 strokeWidth=wedgeStyle.label_pointer_strokeWidth,
880 strokeColor=wedgeStyle.label_pointer_strokeColor))
881 g_add(Line(0.5*(l._aax+l.x),l.y+(0.25*(y2-y1)),l.x,l.y+(0.25*(y2-y1)),
882 strokeWidth=wedgeStyle.label_pointer_strokeWidth,
883 strokeColor=wedgeStyle.label_pointer_strokeColor))
884 else:
885 g_add(Line(l._aax,l._aay,0.5*(l._aax+l.x),l.y+(0.25*(y2-y1)),
886 strokeWidth=wedgeStyle.label_pointer_strokeWidth,
887 strokeColor=wedgeStyle.label_pointer_strokeColor))
888 g_add(Line(0.5*(l._aax+l.x),l.y+(0.25*(y2-y1)),l.x,l.y+(0.25*(y2-y1)),
889 strokeWidth=wedgeStyle.label_pointer_strokeWidth,
890 strokeColor=wedgeStyle.label_pointer_strokeColor))
740891
741 return g892 return g
742893
@@ -899,7 +1050,7 @@
899 drawing.add(self.draw())1050 drawing.add(self.draw())
900 return drawing1051 return drawing
9011052
902from utils3d import _getShaded, _2rad, _360, _pi_2, _2pi, _180_pi1053from reportlab.graphics.charts.utils3d import _getShaded, _2rad, _360, _pi_2, _2pi, _180_pi
903class Wedge3dProperties(PropHolder):1054class Wedge3dProperties(PropHolder):
904 """This holds descriptive information about the wedges in a pie chart.1055 """This holds descriptive information about the wedges in a pie chart.
9051056
@@ -979,6 +1130,7 @@
979 self.lo = lo1130 self.lo = lo
980 self.hi = hi1131 self.hi = hi
981 self.mid = (lo+hi)*0.51132 self.mid = (lo+hi)*0.5
1133 self.not360 = abs(hi-lo) < _ANGLEHI
9821134
983 def __str__(self):1135 def __str__(self):
984 return '_SL3D(%.2f,%.2f)' % (self.lo,self.hi)1136 return '_SL3D(%.2f,%.2f)' % (self.lo,self.hi)
@@ -995,7 +1147,7 @@
995 angle_3d = 1801147 angle_3d = 180
9961148
997 def _popout(self,i):1149 def _popout(self,i):
998 return self.slices[i].popout or 01150 return self._sl3d[i].not360 and self.slices[i].popout or 0
9991151
1000 def CX(self, i,d ):1152 def CX(self, i,d ):
1001 return self._cx+(d and self._xdepth_3d or 0)+self._popout(i)*cos(_2rad(self._sl3d[i].mid))1153 return self._cx+(d and self._xdepth_3d or 0)+self._popout(i)*cos(_2rad(self._sl3d[i].mid))
@@ -1045,8 +1197,9 @@
1045 _3d_angle = self.angle_3d1197 _3d_angle = self.angle_3d
1046 _3dva = self._3dva = _360(_3d_angle+90)1198 _3dva = self._3dva = _360(_3d_angle+90)
1047 a0 = _2rad(_3dva)1199 a0 = _2rad(_3dva)
1048 self._xdepth_3d = cos(a0)*self.depth_3d1200 depth_3d = self.depth_3d
1049 self._ydepth_3d = sin(a0)*self.depth_3d1201 self._xdepth_3d = cos(a0)*depth_3d
1202 self._ydepth_3d = sin(a0)*depth_3d
1050 self._cx = self.x+self.width/2.01203 self._cx = self.x+self.width/2.0
1051 self._cy = self.y+(self.height - self._ydepth_3d)/2.01204 self._cy = self.y+(self.height - self._ydepth_3d)/2.0
1052 radiusx = radiusy = self._cx-self.x1205 radiusx = radiusy = self._cx-self.x
@@ -1098,7 +1251,8 @@
1098 sl = _sl3d[i]1251 sl = _sl3d[i]
1099 lo = angle0 = sl.lo1252 lo = angle0 = sl.lo
1100 hi = angle1 = sl.hi1253 hi = angle1 = sl.hi
1101 if abs(hi-lo)<=1e-7: continue1254 aa = abs(hi-lo)
1255 if aa<_ANGLELO: continue
1102 fillColor = _getShaded(style.fillColor,style.fillColorShaded,style.shading)1256 fillColor = _getShaded(style.fillColor,style.fillColorShaded,style.shading)
1103 strokeColor = _getShaded(style.strokeColor,style.strokeColorShaded,style.shading) or fillColor1257 strokeColor = _getShaded(style.strokeColor,style.strokeColorShaded,style.shading) or fillColor
1104 strokeWidth = style.strokeWidth1258 strokeWidth = style.strokeWidth
@@ -1106,31 +1260,39 @@
1106 cy0 = CY(i,0)1260 cy0 = CY(i,0)
1107 cx1 = CX(i,1)1261 cx1 = CX(i,1)
1108 cy1 = CY(i,1)1262 cy1 = CY(i,1)
1109 #background shaded pie bottom1263 if depth_3d:
1110 g.add(Wedge(cx1,cy1,radiusx, lo, hi,yradius=radiusy,1264 #background shaded pie bottom
1111 strokeColor=strokeColor,strokeWidth=strokeWidth,fillColor=fillColor,1265 g.add(Wedge(cx1,cy1,radiusx, lo, hi,yradius=radiusy,
1112 strokeLineJoin=1))1266 strokeColor=strokeColor,strokeWidth=strokeWidth,fillColor=fillColor,
1113 #connect to top1267 strokeLineJoin=1))
1114 if lo < a0 < hi: angle0 = a01268 #connect to top
1115 if lo < a1 < hi: angle1 = a11269 if lo < a0 < hi: angle0 = a0
1116 p = ArcPath(strokeColor=strokeColor, fillColor=fillColor,strokeWidth=strokeWidth,strokeLineJoin=1)1270 if lo < a1 < hi: angle1 = a1
1117 p.addArc(cx1,cy1,radiusx,angle0,angle1,yradius=radiusy,moveTo=1)1271 p = ArcPath(strokeColor=strokeColor, fillColor=fillColor,strokeWidth=strokeWidth,strokeLineJoin=1)
1118 p.lineTo(OX(i,angle1,0),OY(i,angle1,0))1272 p.addArc(cx1,cy1,radiusx,angle0,angle1,yradius=radiusy,moveTo=1)
1119 p.addArc(cx0,cy0,radiusx,angle0,angle1,yradius=radiusy,reverse=1)1273 p.lineTo(OX(i,angle1,0),OY(i,angle1,0))
1120 p.closePath()1274 p.addArc(cx0,cy0,radiusx,angle0,angle1,yradius=radiusy,reverse=1)
1121 if angle0<=_3dva and angle1>=_3dva:1275 p.closePath()
1122 rd = 01276 if angle0<=_3dva and angle1>=_3dva:
1123 else:1277 rd = 0
1124 rd = min(rad_dist(angle0),rad_dist(angle1))1278 else:
1125 S.append((rd,p))1279 rd = min(rad_dist(angle0),rad_dist(angle1))
1126 _fillSide(S,i,lo,strokeColor,strokeWidth,fillColor)1280 S.append((rd,p))
1127 _fillSide(S,i,hi,strokeColor,strokeWidth,fillColor)1281 _fillSide(S,i,lo,strokeColor,strokeWidth,fillColor)
1282 _fillSide(S,i,hi,strokeColor,strokeWidth,fillColor)
11281283
1129 #bright shaded top1284 #bright shaded top
1130 fillColor = style.fillColor1285 fillColor = style.fillColor
1131 strokeColor = style.strokeColor or fillColor1286 strokeColor = style.strokeColor or fillColor
1132 T.append(Wedge(cx0,cy0,radiusx,lo,hi,yradius=radiusy,1287 T.append(Wedge(cx0,cy0,radiusx,lo,hi,yradius=radiusy,
1133 strokeColor=strokeColor,strokeWidth=strokeWidth,fillColor=fillColor,strokeLineJoin=1))1288 strokeColor=strokeColor,strokeWidth=strokeWidth,fillColor=fillColor,strokeLineJoin=1))
1289 if aa>=_ANGLEHI:
1290 theWedge = Ellipse(cx0, cy0, radiusx, radiusy,
1291 strokeColor=strokeColor,strokeWidth=strokeWidth,fillColor=fillColor,strokeLineJoin=1)
1292 else:
1293 theWedge = Wedge(cx0,cy0,radiusx,lo,hi,yradius=radiusy,
1294 strokeColor=strokeColor,strokeWidth=strokeWidth,fillColor=fillColor,strokeLineJoin=1)
1295 T.append(theWedge)
11341296
1135 text = labels[i]1297 text = labels[i]
1136 if style.label_visible and text:1298 if style.label_visible and text:
@@ -1152,7 +1314,7 @@
11521314
1153 S.sort(lambda a,b: -cmp(a[0],b[0]))1315 S.sort(lambda a,b: -cmp(a[0],b[0]))
1154 if checkLabelOverlap and L:1316 if checkLabelOverlap and L:
1155 fixLabelOverlaps(L)1317 fixLabelOverlaps(L,sideLabels)
1156 for x in ([s[1] for s in S]+T+L):1318 for x in ([s[1] for s in S]+T+L):
1157 g.add(x)1319 g.add(x)
1158 return g1320 return g
@@ -1329,3 +1491,175 @@
1329 d.add(pc)1491 d.add(pc)
13301492
1331 return d1493 return d
1494
1495def sample5():
1496 "Make a pie with side labels."
1497
1498 d = Drawing(400, 200)
1499
1500 pc = Pie()
1501 pc.x = 125
1502 pc.y = 25
1503
1504 pc.data = [7, 1, 1, 1, 1, 2]
1505 pc.labels = ['example1', 'example2', 'example3', 'example4', 'example5', 'example6']
1506 pc.sideLabels = 1
1507
1508 pc.width = 150
1509 pc.height = 150
1510 pc.slices.strokeWidth=1#0.5
1511 pc.slices[0].fillColor = colors.steelblue
1512 pc.slices[1].fillColor = colors.thistle
1513 pc.slices[2].fillColor = colors.cornflower
1514 pc.slices[3].fillColor = colors.lightsteelblue
1515 pc.slices[4].fillColor = colors.aquamarine
1516 pc.slices[5].fillColor = colors.cadetblue
1517
1518 d.add(pc)
1519
1520 return d
1521
1522def sample6():
1523
1524 "Illustrates the pie moving to leave space for the left labels"
1525
1526 d = Drawing(400, 200)
1527
1528 pc = Pie()
1529 "The x value of the pie chart is 0"
1530 pc.x = 0
1531 pc.y = 25
1532
1533 pc.data = [74, 1, 1, 1, 1, 22]
1534 pc.labels = ['example1', 'example2', 'example3', 'example4', 'example5', 'example6']
1535 pc.sideLabels = 1
1536
1537 pc.width = 150
1538 pc.height = 150
1539 pc.slices.strokeWidth=1#0.5
1540 pc.slices[0].fillColor = colors.steelblue
1541 pc.slices[1].fillColor = colors.thistle
1542 pc.slices[2].fillColor = colors.cornflower
1543 pc.slices[3].fillColor = colors.lightsteelblue
1544 pc.slices[4].fillColor = colors.aquamarine
1545 pc.slices[5].fillColor = colors.cadetblue
1546
1547 l = Line(0,0,0,200)
1548
1549 d.add(pc)
1550 d.add(l)
1551
1552 return d
1553
1554def sample7():
1555
1556 "Case with overlapping pointers"
1557
1558 d = Drawing(400, 200)
1559
1560 pc = Pie()
1561 pc.y = 50
1562 pc.x = 150
1563 pc.width = 100
1564 pc.height = 100
1565
1566 pc.data = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
1567 pc.labels = ['example1', 'example2', 'example3', 'example4', 'example5', 'example6', 'example7',
1568 'example8', 'example9', 'example10', 'example11', 'example12', 'example13', 'example14',
1569 'example15', 'example16', 'example17', 'example18', 'example19', 'example20', 'example21',
1570 'example22', 'example23', 'example24', 'example25', 'example26', 'example27', 'example28']
1571 pc.sideLabels = 1
1572 pc.checkLabelOverlap = 1
1573 pc.simpleLabels = 0
1574
1575
1576 pc.slices.strokeWidth=1#0.5
1577 pc.slices[0].fillColor = colors.steelblue
1578 pc.slices[1].fillColor = colors.thistle
1579 pc.slices[2].fillColor = colors.cornflower
1580 pc.slices[3].fillColor = colors.lightsteelblue
1581 pc.slices[4].fillColor = colors.aquamarine
1582 pc.slices[5].fillColor = colors.cadetblue
1583
1584 d.add(pc)
1585
1586 return d
1587
1588def sample8():
1589
1590 "Case with overlapping labels"
1591 "Labels overlap if they do not belong to adjacent pie slices due to nature of checkLabelOverlap"
1592
1593 d = Drawing(400, 200)
1594
1595 pc = Pie()
1596 pc.y = 50
1597 pc.x = 150
1598 pc.width = 100
1599 pc.height = 100
1600
1601 pc.data = [1, 1, 1, 1, 1, 30, 50, 1, 1, 1, 1, 1, 1, 40,20,10]
1602 pc.labels = ['example1', 'example2', 'example3', 'example4', 'example5', 'example6', 'example7',
1603 'example8', 'example9', 'example10', 'example11', 'example12', 'example13', 'example14',
1604 'example15', 'example16']
1605 pc.sideLabels = 1
1606 pc.checkLabelOverlap = 1
1607
1608 pc.slices.strokeWidth=1#0.5
1609 pc.slices[0].fillColor = colors.steelblue
1610 pc.slices[1].fillColor = colors.thistle
1611 pc.slices[2].fillColor = colors.cornflower
1612 pc.slices[3].fillColor = colors.lightsteelblue
1613 pc.slices[4].fillColor = colors.aquamarine
1614 pc.slices[5].fillColor = colors.cadetblue
1615
1616 d.add(pc)
1617
1618 return d
1619
1620def sample9():
1621
1622 "Case with overlapping labels"
1623 "Labels overlap if they do not belong to adjacent pies due to nature of checkLabelOverlap"
1624
1625 d = Drawing(400, 200)
1626
1627 pc = Pie()
1628 pc.x = 125
1629 pc.y = 50
1630
1631 pc.data = [41, 20, 40, 15, 20, 30, 50, 15, 25, 35, 25, 20, 30, 40, 20, 30]
1632 pc.labels = ['example1', 'example2', 'example3', 'example4', 'example5', 'example6', 'example7',
1633 'example8', 'example9', 'example10', 'example11', 'example12', 'example13', 'example14',
1634 'example15', 'example16']
1635 pc.sideLabels = 1
1636 pc.checkLabelOverlap = 1
1637
1638 pc.width = 100
1639 pc.height = 100
1640 pc.slices.strokeWidth=1#0.5
1641 pc.slices[0].fillColor = colors.steelblue
1642 pc.slices[1].fillColor = colors.thistle
1643 pc.slices[2].fillColor = colors.cornflower
1644 pc.slices[3].fillColor = colors.lightsteelblue
1645 pc.slices[4].fillColor = colors.aquamarine
1646 pc.slices[5].fillColor = colors.cadetblue
1647
1648 d.add(pc)
1649
1650 return d
1651
1652
1653
1654if __name__=='__main__':
1655 """Normally nobody will execute this
1656
1657 It's helpful for reportlab developers to put a 'main' block in to execute
1658 the most recently edited feature.
1659 """
1660 drawing = sample7()
1661 from reportlab.graphics import renderPDF
1662 renderPDF.drawToFile(drawing, 'side_labelled_pie.pdf', 'Side Labelled Pie')
1663
1664
1665
13321666
=== modified file 'src/reportlab/graphics/charts/textlabels.py'
--- src/reportlab/graphics/charts/textlabels.py 2010-12-06 12:45:44 +0000
+++ src/reportlab/graphics/charts/textlabels.py 2013-04-14 00:52:26 +0000
@@ -1,7 +1,7 @@
1#Copyright ReportLab Europe Ltd. 2000-20041#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/textlabels.py3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/textlabels.py
4__version__=''' $Id: textlabels.py 3702 2010-04-14 17:13:41Z rgbecker $ '''4__version__=''' $Id: textlabels.py 3959 2012-09-27 14:39:39Z robin $ '''
5import string5import string
66
7from reportlab.lib import colors7from reportlab.lib import colors
88
=== modified file 'src/reportlab/graphics/charts/utils.py'
--- src/reportlab/graphics/charts/utils.py 2010-12-06 12:45:44 +0000
+++ src/reportlab/graphics/charts/utils.py 2013-04-14 00:52:26 +0000
@@ -1,13 +1,17 @@
1#Copyright ReportLab Europe Ltd. 2000-20041#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/utils.py3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/utils.py
44
5__version__=''' $Id: utils.py 3746 2010-07-21 10:32:55Z rgbecker $ '''5__version__=''' $Id: utils.py 3959 2012-09-27 14:39:39Z robin $ '''
6__doc__="Utilities used here and there."6__doc__="Utilities used here and there."
7from time import mktime, gmtime, strftime7from time import mktime, gmtime, strftime
8from math import log10, pi, floor, sin, cos, sqrt, hypot
9import weakref
10from reportlab.graphics.shapes import transformPoint, transformPoints, inverse, Ellipse, Group, String, Path
11from reportlab.lib.utils import flatten
12from reportlab.pdfbase.pdfmetrics import stringWidth
813
9### Dinu's stuff used in some line plots (likely to vansih).14### Dinu's stuff used in some line plots (likely to vansih).
10
11def mkTimeTuple(timeString):15def mkTimeTuple(timeString):
12 "Convert a 'dd/mm/yyyy' formatted string to a tuple for use in the time module."16 "Convert a 'dd/mm/yyyy' formatted string to a tuple for use in the time module."
1317
@@ -17,23 +21,17 @@
1721
18 return tuple(list)22 return tuple(list)
1923
20
21def str2seconds(timeString):24def str2seconds(timeString):
22 "Convert a number of seconds since the epoch into a date string."25 "Convert a number of seconds since the epoch into a date string."
2326
24 return mktime(mkTimeTuple(timeString))27 return mktime(mkTimeTuple(timeString))
2528
26
27def seconds2str(seconds):29def seconds2str(seconds):
28 "Convert a date string into the number of seconds since the epoch."30 "Convert a date string into the number of seconds since the epoch."
2931
30 return strftime('%Y-%m-%d', gmtime(seconds))32 return strftime('%Y-%m-%d', gmtime(seconds))
3133
32
33### Aaron's rounding function for making nice values on axes.34### Aaron's rounding function for making nice values on axes.
34
35from math import log10
36
37def nextRoundNumber(x):35def nextRoundNumber(x):
38 """Return the first 'nice round number' greater than or equal to x36 """Return the first 'nice round number' greater than or equal to x
3937
@@ -72,15 +70,8 @@
72 else:70 else:
73 return base * 10.071 return base * 10.0
7472
75
76### Robin's stuff from rgb_ticks.
77
78from math import log10, floor
79
80_intervals=(.1, .2, .25, .5)73_intervals=(.1, .2, .25, .5)
81_j_max=len(_intervals)-174_j_max=len(_intervals)-1
82
83
84def find_interval(lo,hi,I=5):75def find_interval(lo,hi,I=5):
85 'determine tick parameters for range [lo, hi] using I intervals'76 'determine tick parameters for range [lo, hi] using I intervals'
8677
@@ -128,7 +119,6 @@
128 b = b*10119 b = b*10
129 return n, x, ss, lo - n + x - hi120 return n, x, ss, lo - n + x - hi
130121
131
132def find_good_grid(lower,upper,n=(4,5,6,7,8,9), grid=None):122def find_good_grid(lower,upper,n=(4,5,6,7,8,9), grid=None):
133 if grid:123 if grid:
134 t = divmod(lower,grid)[0] * grid124 t = divmod(lower,grid)[0] * grid
@@ -149,7 +139,6 @@
149 w=z[3]139 w=z[3]
150 return t, hi, grid140 return t, hi, grid
151141
152
153def ticks(lower, upper, n=(4,5,6,7,8,9), split=1, percent=0, grid=None, labelVOffset=0):142def ticks(lower, upper, n=(4,5,6,7,8,9), split=1, percent=0, grid=None, labelVOffset=0):
154 '''143 '''
155 return tick positions and labels for range lower<=x<=upper144 return tick positions and labels for range lower<=x<=upper
@@ -223,9 +212,6 @@
223def pairMaverage(data,n=6):212def pairMaverage(data,n=6):
224 return [(x[0],s) for x,s in zip(data, maverage([x[1] for x in data],n))]213 return [(x[0],s) for x,s in zip(data, maverage([x[1] for x in data],n))]
225214
226import weakref
227from reportlab.graphics.shapes import transformPoint, transformPoints, inverse, Ellipse
228from reportlab.lib.utils import flatten
229class DrawTimeCollector(object):215class DrawTimeCollector(object):
230 '''216 '''
231 generic mechanism for collecting information about nodes at the time they are about to be drawn217 generic mechanism for collecting information about nodes at the time they are about to be drawn
@@ -311,3 +297,66 @@
311 pprint.pprint(self._info,f)297 pprint.pprint(self._info,f)
312 finally:298 finally:
313 f.close()299 f.close()
300
301def xyDist( (x0,y0),(x1,y1) ):
302 '''return distance between two points'''
303 return hypot((x1-x0),(y1-y0))
304
305def lineSegmentIntersect(
306 (x00,y00),(x01,y01),
307 (x10,y10),(x11,y11)
308 ):
309 p = x00,y00
310 r = x01-x00,y01-y00
311
312
313 q = x10,y10
314 s = x11-x10,y11-y10
315
316 rs = float(r[0]*s[1]-r[1]*s[0])
317 qp = q[0]-p[0],q[1]-p[1]
318
319 qpr = qp[0]*r[1]-qp[1]*r[0]
320 qps = qp[0]*s[1]-qp[1]*s[0]
321
322 if abs(rs)<1e-8:
323 if abs(qpr)<1e-8: return 'collinear'
324 return None
325
326 t = qps/rs
327 u = qpr/rs
328
329 if 0<=t<=1 and 0<=u<=1:
330 return p[0]+t*r[0], p[1]+t*r[1]
331
332def makeCircularString(x, y, radius, angle, text, fontName, fontSize, inside=0, G=None,textAnchor='start'):
333 '''make a group with circular text in it'''
334 if not G: G = Group()
335
336 angle %= 360
337 pi180 = pi/180
338 phi = angle*pi180
339 width = stringWidth(text, fontName, fontSize)
340 sig = inside and -1 or 1
341 hsig = sig*0.5
342 sig90 = sig*90
343
344 if textAnchor!='start':
345 if textAnchor=='middle':
346 phi += sig*(0.5*width)/radius
347 elif textAnchor=='end':
348 phi += sig*float(width)/radius
349 elif textAnchor=='numeric':
350 phi += sig*float(numericXShift(textAnchor,text,width,fontName,fontSize,None))/radius
351
352 for letter in text:
353 width = stringWidth(letter, fontName, fontSize)
354 beta = float(width)/radius
355 h = Group()
356 h.add(String(0, 0, letter, fontName=fontName,fontSize=fontSize,textAnchor="start"))
357 h.translate(x+cos(phi)*radius,y+sin(phi)*radius) #translate to radius and angle
358 h.rotate((phi-hsig*beta)/pi180-sig90) # rotate as needed
359 G.add(h) #add to main group
360 phi -= sig*beta #increment
361
362 return G
314363
=== modified file 'src/reportlab/graphics/renderPDF.py'
--- src/reportlab/graphics/renderPDF.py 2010-12-06 12:45:44 +0000
+++ src/reportlab/graphics/renderPDF.py 2013-04-14 00:52:26 +0000
@@ -1,9 +1,9 @@
1#Copyright ReportLab Europe Ltd. 2000-20041#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/renderPDF.py3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/renderPDF.py
4# renderPDF - draws Drawings onto a canvas4# renderPDF - draws Drawings onto a canvas
55
6__version__=''' $Id: renderPDF.py 3751 2010-07-30 09:28:28Z rgbecker $ '''6__version__=''' $Id: renderPDF.py 3959 2012-09-27 14:39:39Z robin $ '''
7__doc__="""Render Drawing objects within others PDFs or standalone7__doc__="""Render Drawing objects within others PDFs or standalone
88
9Usage::9Usage::
@@ -78,10 +78,11 @@
78 )78 )
7979
80 def drawImage(self, image):80 def drawImage(self, image):
81 path = image.path
81 # currently not implemented in other renderers82 # currently not implemented in other renderers
82 if image.path and os.path.exists(image.path):83 if path and (hasattr(path,'mode') or os.path.exists(image.path)):
83 self._canvas.drawInlineImage(84 self._canvas.drawInlineImage(
84 image.path,85 path,
85 image.x, image.y,86 image.x, image.y,
86 image.width, image.height87 image.width, image.height
87 )88 )
@@ -217,7 +218,12 @@
217# self._canvas.setDash(array=value)218# self._canvas.setDash(array=value)
218 elif key == 'strokeDashArray':219 elif key == 'strokeDashArray':
219 if value:220 if value:
220 self._canvas.setDash(value)221 if isinstance(value,(list,tuple)) and len(value)==2 and isinstance(value[1],(tuple,list)):
222 phase = value[0]
223 value = value[1]
224 else:
225 phase = 0
226 self._canvas.setDash(value,phase)
221 else:227 else:
222 self._canvas.setDash()228 self._canvas.setDash()
223 elif key == 'fillColor':229 elif key == 'fillColor':
224230
=== modified file 'src/reportlab/graphics/renderPM.py'
--- src/reportlab/graphics/renderPM.py 2010-12-06 12:45:44 +0000
+++ src/reportlab/graphics/renderPM.py 2013-04-14 00:52:26 +0000
@@ -1,7 +1,7 @@
1#Copyright ReportLab Europe Ltd. 2000-20041#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3#history www.reportlab.co.uk/rl-cgi/viewcvs.cgi/rlextra/graphics/Csrc/renderPM/renderP.py3#history www.reportlab.co.uk/rl-cgi/viewcvs.cgi/rlextra/graphics/Csrc/renderPM/renderP.py
4__version__=''' $Id: renderPM.py 3704 2010-04-15 13:41:32Z rgbecker $ '''4__version__=''' $Id: renderPM.py 3959 2012-09-27 14:39:39Z robin $ '''
5__doc__="""Render drawing objects in common bitmap formats5__doc__="""Render drawing objects in common bitmap formats
66
7Usage::7Usage::
@@ -78,7 +78,13 @@
78 self._canvas.lineCap = s['strokeLineCap']78 self._canvas.lineCap = s['strokeLineCap']
79 self._canvas.lineJoin = s['strokeLineJoin']79 self._canvas.lineJoin = s['strokeLineJoin']
80 da = s['strokeDashArray']80 da = s['strokeDashArray']
81 da = da and (0,da) or None81 if not da:
82 da = None
83 else:
84 if not isinstance(da,(list,tuple)):
85 da = da,
86 if len(da)!=2 or not isinstance(da[1],(list,tuple)):
87 da = 0, da #assume phase of 0
82 self._canvas.dashArray = da88 self._canvas.dashArray = da
83 alpha = s['fillOpacity']89 alpha = s['fillOpacity']
84 if alpha is not None:90 if alpha is not None:
@@ -117,19 +123,22 @@
117 self._canvas.line(line.x1,line.y1,line.x2,line.y2)123 self._canvas.line(line.x1,line.y1,line.x2,line.y2)
118124
119 def drawImage(self, image):125 def drawImage(self, image):
120 if image.path and os.path.exists(image.path):126 path = image.path
121 if type(image.path) is type(''):127 if isinstance(path,basestring):
122 im = _getImage().open(image.path).convert('RGB')128 if not (path and os.path.isfile(path)): return
123 else:129 im = _getImage().open(path).convert('RGB')
124 im = image.path.convert('RGB')130 elif hasattr(path,'convert'):
125 srcW, srcH = im.size131 im = path.convert('RGB')
126 dstW, dstH = image.width, image.height132 else:
127 if dstW is None: dstW = srcW133 return
128 if dstH is None: dstH = srcH134 srcW, srcH = im.size
129 self._canvas._aapixbuf(135 dstW, dstH = image.width, image.height
130 image.x, image.y, dstW, dstH,136 if dstW is None: dstW = srcW
131 im.tostring(), srcW, srcH, 3,137 if dstH is None: dstH = srcH
132 )138 self._canvas._aapixbuf(
139 image.x, image.y, dstW, dstH,
140 im.tostring(), srcW, srcH, 3,
141 )
133142
134 def drawCircle(self, circle):143 def drawCircle(self, circle):
135 c = self._canvas144 c = self._canvas
@@ -658,7 +667,7 @@
658667
659save = drawToFile668save = drawToFile
660669
661def test():670def test(verbose=True):
662 def ext(x):671 def ext(x):
663 if x=='tiff': x='tif'672 if x=='tiff': x='tif'
664 return x673 return x
@@ -719,7 +728,7 @@
719 html.append('<a href="%s">python source</a><br>\n' % filename)728 html.append('<a href="%s">python source</a><br>\n' % filename)
720 elif k=='svg':729 elif k=='svg':
721 html.append('<a href="%s">SVG</a><br>\n' % filename)730 html.append('<a href="%s">SVG</a><br>\n' % filename)
722 print 'wrote',fullpath731 if verbose: print 'wrote',fullpath
723 except AttributeError:732 except AttributeError:
724 print 'Problem drawing %s file'%k733 print 'Problem drawing %s file'%k
725 raise734 raise
@@ -731,7 +740,7 @@
731 if sys.platform=='mac':740 if sys.platform=='mac':
732 from reportlab.lib.utils import markfilename741 from reportlab.lib.utils import markfilename
733 markfilename(htmlFileName,ext='HTML')742 markfilename(htmlFileName,ext='HTML')
734 print 'wrote %s' % htmlFileName743 if verbose: print 'wrote %s' % htmlFileName
735744
736if __name__=='__main__':745if __name__=='__main__':
737 test()746 test()
738747
=== modified file 'src/reportlab/graphics/renderPS.py'
--- src/reportlab/graphics/renderPS.py 2010-12-06 12:45:44 +0000
+++ src/reportlab/graphics/renderPS.py 2013-04-14 00:52:26 +0000
@@ -1,7 +1,7 @@
1#Copyright ReportLab Europe Ltd. 2000-20041#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/renderPS.py3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/renderPS.py
4__version__=''' $Id: renderPS.py 3695 2010-04-06 16:16:27Z rgbecker $ '''4__version__=''' $Id: renderPS.py 3959 2012-09-27 14:39:39Z robin $ '''
5__doc__="""Render drawing objects in Postscript"""5__doc__="""Render drawing objects in Postscript"""
66
7import string, types7import string, types
@@ -186,9 +186,9 @@
186 """Two notations. pass two numbers, or an array and phase"""186 """Two notations. pass two numbers, or an array and phase"""
187 # copied and modified from reportlab.canvas187 # copied and modified from reportlab.canvas
188 psoperation = "setdash"188 psoperation = "setdash"
189 if type(array) == types.IntType or type(array) == types.FloatType:189 if isinstance(array,(float,int)):
190 self.code_append('[%s %s] 0 %s' % (array, phase, psoperation))190 self.code_append('[%s %s] 0 %s' % (array, phase, psoperation))
191 elif type(array) == types.ListType or type(array) == types.TupleType:191 elif isinstance(array,(tuple,list)):
192 assert phase >= 0, "phase is a length in user space"192 assert phase >= 0, "phase is a length in user space"
193 textarray = string.join(map(str, array))193 textarray = string.join(map(str, array))
194 self.code_append('[%s] %s %s' % (textarray, phase, psoperation))194 self.code_append('[%s] %s %s' % (textarray, phase, psoperation))
@@ -833,7 +833,12 @@
833 self._canvas.setLineJoin(value)833 self._canvas.setLineJoin(value)
834 elif key == 'strokeDashArray':834 elif key == 'strokeDashArray':
835 if value:835 if value:
836 self._canvas.setDash(value)836 if isinstance(value,(list,tuple)) and len(value)==2 and isinstance(value[1],(tuple,list)):
837 phase = value[0]
838 value = value[1]
839 else:
840 phase = 0
841 self._canvas.setDash(value,phase)
837 else:842 else:
838 self._canvas.setDash()843 self._canvas.setDash()
839## elif key == 'stroke_opacity':844## elif key == 'stroke_opacity':
840845
=== modified file 'src/reportlab/graphics/renderSVG.py'
--- src/reportlab/graphics/renderSVG.py 2010-12-06 12:45:44 +0000
+++ src/reportlab/graphics/renderSVG.py 2013-04-14 00:52:26 +0000
@@ -95,8 +95,9 @@
9595
96### classes ###96### classes ###
97class SVGCanvas:97class SVGCanvas:
98 def __init__(self, size=(300,300)):98 def __init__(self, size=(300,300), encoding='utf-8', verbose=0):
99 self.verbose = 099 self.verbose = verbose
100 self.encoding = encoding
100 self.width, self.height = self.size = size101 self.width, self.height = self.size = size
101 # self.height = size[1]102 # self.height = size[1]
102 self.code = []103 self.code = []
@@ -126,11 +127,16 @@
126 self.svg = self.doc.documentElement127 self.svg = self.doc.documentElement
127 self.svg.setAttribute("width", str(size[0]))128 self.svg.setAttribute("width", str(size[0]))
128 self.svg.setAttribute("height", str(self.height))129 self.svg.setAttribute("height", str(self.height))
130 self.svg.setAttribute("preserveAspectRatio", "xMinYMin meet")
131 self.svg.setAttribute("viewBox", "0 0 %d %d" % (self.width, self.height))
129132
130 #these suggested by Tim Roberts, as updated by peter@maubp.freeserve.co.uk 133 #these suggested by Tim Roberts, as updated by peter@maubp.freeserve.co.uk
131 self.svg.setAttribute("xmlns", "http://www.w3.org/2000/svg")134 self.svg.setAttribute("xmlns", "http://www.w3.org/2000/svg")
132 self.svg.setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink")135 self.svg.setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink")
133 self.svg.setAttribute("version", "1.0")136 self.svg.setAttribute("version", "1.0")
137
138
139
134 #self.svg.setAttribute("baseProfile", "full") #disliked in V 1.0140 #self.svg.setAttribute("baseProfile", "full") #disliked in V 1.0
135 title = self.doc.createElement('title')141 title = self.doc.createElement('title')
136 text = self.doc.createTextNode('...')142 text = self.doc.createTextNode('...')
@@ -163,12 +169,12 @@
163 self.currGroup = self.groupTree169 self.currGroup = self.groupTree
164170
165 def save(self, fn=None):171 def save(self, fn=None):
166 if isinstance(fn,str):172 if type(fn) in types.StringTypes:
167 f = open(fn, 'w')173 f = open(fn, 'w')
168 else:174 else:
169 f = fn175 f = fn
170176
171 f.write(self.doc.toprettyxml(indent=" "))177 f.write(self.doc.toprettyxml(indent=" ",encoding=self.encoding))
172178
173 if f is not fn:179 if f is not fn:
174 f.close()180 f.close()
@@ -253,9 +259,9 @@
253 def setDash(self, array=[], phase=0):259 def setDash(self, array=[], phase=0):
254 """Two notations. Pass two numbers, or an array and phase."""260 """Two notations. Pass two numbers, or an array and phase."""
255261
256 if type(array) in (types.IntType, types.FloatType):262 if isinstance(array,(float,int)):
257 self.style['stroke-dasharray'] = ', '.join(map(str, ([array, phase])))263 self.style['stroke-dasharray'] = ', '.join(map(str, ([array, phase])))
258 elif type(array) in (types.ListType, types.TupleType) and len(array) > 0:264 elif isinstance(array,(tuple,list)) and len(array) > 0:
259 assert phase >= 0, "phase is a length in user space"265 assert phase >= 0, "phase is a length in user space"
260 self.style['stroke-dasharray'] = ', '.join(map(str, (array+[phase])))266 self.style['stroke-dasharray'] = ', '.join(map(str, (array+[phase])))
261267
@@ -754,7 +760,12 @@
754 self._canvas.setLineJoin(value)760 self._canvas.setLineJoin(value)
755 elif key == 'strokeDashArray':761 elif key == 'strokeDashArray':
756 if value:762 if value:
757 self._canvas.setDash(value)763 if isinstance(value,(list,tuple)) and len(value)==2 and isinstance(value[1],(tuple,list)):
764 phase = value[0]
765 value = value[1]
766 else:
767 phase = 0
768 self._canvas.setDash(value,phase)
758 else:769 else:
759 self._canvas.setDash()770 self._canvas.setDash()
760 elif key == 'fillColor':771 elif key == 'fillColor':
761772
=== modified file 'src/reportlab/graphics/renderbase.py'
--- src/reportlab/graphics/renderbase.py 2010-12-06 12:45:44 +0000
+++ src/reportlab/graphics/renderbase.py 2013-04-14 00:52:26 +0000
@@ -1,4 +1,4 @@
1#Copyright ReportLab Europe Ltd. 2000-20041#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/renderbase.py3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/renderbase.py
44
55
=== modified file 'src/reportlab/graphics/shapes.py'
--- src/reportlab/graphics/shapes.py 2010-12-06 12:45:44 +0000
+++ src/reportlab/graphics/shapes.py 2013-04-14 00:52:26 +0000
@@ -1,12 +1,12 @@
1#Copyright ReportLab Europe Ltd. 2000-20041#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/shapes.py3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/shapes.py
44
5__version__=''' $Id: shapes.py 3751 2010-07-30 09:28:28Z rgbecker $ '''5__version__=''' $Id: shapes.py 3959 2012-09-27 14:39:39Z robin $ '''
6__doc__='''Core of the graphics library - defines Drawing and Shapes'''6__doc__='''Core of the graphics library - defines Drawing and Shapes'''
77
8import string, os, sys8import string, os, sys
9from math import pi, cos, sin, tan9from math import pi, cos, sin, tan, sqrt
10from types import FloatType, IntType, ListType, TupleType, StringType, InstanceType10from types import FloatType, IntType, ListType, TupleType, StringType, InstanceType
11from pprint import pprint11from pprint import pprint
1212
@@ -210,6 +210,59 @@
210 yMax = y2210 yMax = y2
211 return (xMin, yMin, xMax, yMax)211 return (xMin, yMin, xMax, yMax)
212212
213def _getBezierExtrema(y0,y1,y2,y3):
214 '''
215 this is used to find if a curveTo path operator has extrema in its range
216 The curveTo operator is defined by the points y0, y1, y2, y3
217
218 B(t):=(1-t)^3*y0+3*(1-t)^2*t*y1+3*(1-t)*t^2*y2+t^3*y3
219 :=t^3*(y3-3*y2+3*y1-y0)+t^2*(3*y2-6*y1+3*y0)+t*(3*y1-3*y0)+y0
220 and is a cubic bezier curve.
221
222 The differential is a quadratic
223 t^2*(3*y3-9*y2+9*y1-3*y0)+t*(6*y2-12*y1+6*y0)+3*y1-3*y0
224
225 The extrema must be at real roots, r, of the above which lie in 0<=r<=1
226
227 The quadratic coefficients are
228 a=3*y3-9*y2+9*y1-3*y0 b=6*y2-12*y1+6*y0 c=3*y1-3*y0
229 or
230 a=y3-3*y2+3*y1-y0 b=2*y2-4*y1+2*y0 c=y1-y0 (remove common factor of 3)
231 or
232 a=y3-3*(y2-y1)-y0 b=2*(y2-2*y1+y0) c=y1-y0
233
234 The returned value is [y0,x1,x2,y3] where if found x1, x2 are any extremals that were found;
235 there can be 0, 1 or 2 extremals
236 '''
237 a=y3-3*(y2-y1)-y0
238 b=2*(y2-2*y1+y0)
239 c=y1-y0
240 Y = [y0] #the set of points
241
242 #standard method to find roots of quadratic
243 d = b*b - 4*a*c
244 if d>=0:
245 d = sqrt(d)
246 if b<0: d = -d
247 q = -0.5*(b+d)
248 R = []
249 try:
250 R.append(q/a)
251 except:
252 pass
253 try:
254 R.append(c/q)
255 except:
256 pass
257 b *= 1.5
258 c *= 3
259 for t in R:
260 if 0<=t<=1:
261 #real root in range evaluate spline there and add to X
262 Y.append(t*(t*(t*a+b)+c)+y0)
263 Y.append(y3)
264 return Y
265
213def getPathBounds(points):266def getPathBounds(points):
214 n = len(points)267 n = len(points)
215 f = lambda i,p = points: p[i]268 f = lambda i,p = points: p[i]
@@ -918,7 +971,7 @@
918 if op == _CLOSEPATH:971 if op == _CLOSEPATH:
919 hadClosePath = hadClosePath + 1972 hadClosePath = hadClosePath + 1
920 if op == _MOVETO:973 if op == _MOVETO:
921 hadMoveTo = hadMoveTo + 1974 hadMoveTo += 1
922 return hadMoveTo == hadClosePath975 return hadMoveTo == hadClosePath
923976
924class Path(SolidShape):977class Path(SolidShape):
@@ -962,7 +1015,32 @@
962 self.operators.append(_CLOSEPATH)1015 self.operators.append(_CLOSEPATH)
9631016
964 def getBounds(self):1017 def getBounds(self):
965 return getPathBounds(self.points)1018 points = self.points
1019 try: #in case this complex algorithm is not yet ready :)
1020 X = []
1021 aX = X.append
1022 eX = X.extend
1023 Y=[]
1024 aY = Y.append
1025 eY = Y.extend
1026 i = 0
1027 for op in self.operators:
1028 nArgs = _PATH_OP_ARG_COUNT[op]
1029 j = i + nArgs
1030 if nArgs==2:
1031 #either moveTo or lineT0
1032 aX(points[i])
1033 aY(points[i+1])
1034 elif nArgs==6:
1035 #curveTo
1036 x1,x2,x3 = points[i:j:2]
1037 eX(_getBezierExtrema(X[-1],x1,x2,x3))
1038 y1,y2,y3 = points[i+1:j:2]
1039 eY(_getBezierExtrema(Y[-1],y1,y2,y3))
1040 i = j
1041 return min(X),min(Y),max(X),max(Y)
1042 except:
1043 return getPathBounds(points)
9661044
967EmptyClipPath=Path() #special path1045EmptyClipPath=Path() #special path
9681046
9691047
=== modified file 'src/reportlab/graphics/testdrawings.py'
--- src/reportlab/graphics/testdrawings.py 2009-02-22 14:19:44 +0000
+++ src/reportlab/graphics/testdrawings.py 2013-04-14 00:52:26 +0000
@@ -1,5 +1,5 @@
1#!/bin/env python1#!/bin/env python
2#Copyright ReportLab Europe Ltd. 2000-20042#Copyright ReportLab Europe Ltd. 2000-2012
3#see license.txt for license details3#see license.txt for license details
4#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/testdrawings.py4#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/testdrawings.py
5__version__=''' $Id $ '''5__version__=''' $Id $ '''
66
=== modified file 'src/reportlab/graphics/testshapes.py'
--- src/reportlab/graphics/testshapes.py 2010-12-06 12:45:44 +0000
+++ src/reportlab/graphics/testshapes.py 2013-04-14 00:52:26 +0000
@@ -1,5 +1,5 @@
1#!/bin/env python1#!/bin/env python
2#Copyright ReportLab Europe Ltd. 2000-20042#Copyright ReportLab Europe Ltd. 2000-2012
3#see license.txt for license details3#see license.txt for license details
4#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/testshapes.py4#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/testshapes.py
55
@@ -60,7 +60,11 @@
60 F.append(name)60 F.append(name)
61 except:61 except:
62 pass62 pass
63_setup()63 return F
64
65for f in _setup():
66 if f not in _FONTS:
67 _FONTS.append(f)
6468
65#########################################################69#########################################################
66#70#
@@ -439,8 +443,8 @@
439 String(10, y, text, fontName=fontName, fontSize = fontSize)))443 String(10, y, text, fontName=fontName, fontSize = fontSize)))
440 y -= 5444 y -= 5
441 return maxx, h-y+gap, D445 return maxx, h-y+gap, D
442 maxx, maxy, D = drawit(F)446 maxx, maxy, D = drawit(_FONTS)
443 if maxx>400 or maxy>200: _,_,D = drawit(F,maxx,maxy)447 if maxx>400 or maxy>200: _,_,D = drawit(_FONTS,maxx,maxy)
444 return D448 return D
445449
446##def getDrawing14():450##def getDrawing14():
447451
=== modified file 'src/reportlab/graphics/widgetbase.py'
--- src/reportlab/graphics/widgetbase.py 2010-12-06 12:45:44 +0000
+++ src/reportlab/graphics/widgetbase.py 2013-04-14 00:52:26 +0000
@@ -1,7 +1,7 @@
1#Copyright ReportLab Europe Ltd. 2000-20041#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/widgetbase.py3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/widgetbase.py
4__version__=''' $Id: widgetbase.py 3742 2010-07-06 16:19:30Z rgbecker $ '''4__version__=''' $Id: widgetbase.py 3959 2012-09-27 14:39:39Z robin $ '''
5__doc__='''Base class for user-defined graphical widgets'''5__doc__='''Base class for user-defined graphical widgets'''
66
7import string7import string
88
=== modified file 'src/reportlab/graphics/widgets/__init__.py'
--- src/reportlab/graphics/widgets/__init__.py 2009-02-22 14:19:44 +0000
+++ src/reportlab/graphics/widgets/__init__.py 2013-04-14 00:52:26 +0000
@@ -1,5 +1,5 @@
1#Copyright ReportLab Europe Ltd. 2000-20041#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/widgets/__init__.py3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/widgets/__init__.py
4__version__=''' $Id: __init__.py 3345 2008-12-12 17:55:22Z damian $ '''4__version__=''' $Id: __init__.py 3959 2012-09-27 14:39:39Z robin $ '''
5__doc__='''Some non-chart widgets'''5__doc__='''Some non-chart widgets'''
66
=== modified file 'src/reportlab/graphics/widgets/grids.py'
--- src/reportlab/graphics/widgets/grids.py 2010-12-06 12:45:44 +0000
+++ src/reportlab/graphics/widgets/grids.py 2013-04-14 00:52:26 +0000
@@ -1,7 +1,7 @@
1#Copyright ReportLab Europe Ltd. 2000-20041#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/widgets/grids.py3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/widgets/grids.py
4__version__=''' $Id: grids.py 3660 2010-02-08 18:17:33Z damian $ '''4__version__=''' $Id: grids.py 3959 2012-09-27 14:39:39Z robin $ '''
55
6from reportlab.lib import colors6from reportlab.lib import colors
7from reportlab.lib.validators import isNumber, isColorOrNone, isBoolean, isListOfNumbers, OneOf, isListOfColors, isNumberOrNone7from reportlab.lib.validators import isNumber, isColorOrNone, isBoolean, isListOfNumbers, OneOf, isListOfColors, isNumberOrNone
@@ -424,7 +424,13 @@
424424
425def centroid(P):425def centroid(P):
426 '''compute average point of a set of points'''426 '''compute average point of a set of points'''
427 return reduce(lambda x,y, fn=float(len(P)): (x[0]+y[0]/fn,x[1]+y[1]/fn),P,(0,0))427 cx = 0
428 cy = 0
429 for x,y in P:
430 cx+=x
431 cy+=y
432 n = float(len(P))
433 return cx/n, cy/n
428434
429def rotatedEnclosingRect(P, angle, rect):435def rotatedEnclosingRect(P, angle, rect):
430 '''436 '''
@@ -485,10 +491,17 @@
485 path.isClipPath = 1491 path.isClipPath = 1
486 g = Group()492 g = Group()
487 g.add(path)493 g.add(path)
488 rect = ShadedRect(strokeWidth=0,strokeColor=None)494 angle = self.angle
495 orientation = 'vertical'
496 if angle==180:
497 angle = 0
498 elif angle in (90,270):
499 orientation ='horizontal'
500 angle = 0
501 rect = ShadedRect(strokeWidth=0,strokeColor=None,orientation=orientation)
489 for k in 'fillColorStart', 'fillColorEnd', 'numShades', 'cylinderMode':502 for k in 'fillColorStart', 'fillColorEnd', 'numShades', 'cylinderMode':
490 setattr(rect,k,getattr(self,k))503 setattr(rect,k,getattr(self,k))
491 g.add(rotatedEnclosingRect(P, self.angle, rect))504 g.add(rotatedEnclosingRect(P, angle, rect))
492 g.add(EmptyClipPath)505 g.add(EmptyClipPath)
493 path = path.copy()506 path = path.copy()
494 path.isClipPath = 0507 path.isClipPath = 0
495508
=== modified file 'src/reportlab/graphics/widgets/markers.py'
--- src/reportlab/graphics/widgets/markers.py 2010-12-06 12:45:44 +0000
+++ src/reportlab/graphics/widgets/markers.py 2013-04-14 00:52:26 +0000
@@ -1,8 +1,8 @@
1#Copyright ReportLab Europe Ltd. 2000-20041#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/widgets/markers.py3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/widgets/markers.py
44
5__version__=''' $Id: markers.py 3660 2010-02-08 18:17:33Z damian $ '''5__version__=''' $Id: markers.py 3959 2012-09-27 14:39:39Z robin $ '''
6__doc__="""This modules defines a collection of markers used in charts.6__doc__="""This modules defines a collection of markers used in charts.
7"""7"""
88
99
=== modified file 'src/reportlab/graphics/widgets/signsandsymbols.py'
--- src/reportlab/graphics/widgets/signsandsymbols.py 2010-02-16 23:32:55 +0000
+++ src/reportlab/graphics/widgets/signsandsymbols.py 2013-04-14 00:52:26 +0000
@@ -1,11 +1,11 @@
1#Copyright ReportLab Europe Ltd. 2000-20041#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/widgets/signsandsymbols.py3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/widgets/signsandsymbols.py
4# signsandsymbols.py4# signsandsymbols.py
5# A collection of new widgets5# A collection of new widgets
6# author: John Precedo (johnp@reportlab.com)6# author: John Precedo (johnp@reportlab.com)
77
8__version__=''' $Id: signsandsymbols.py 3632 2010-01-14 10:25:06Z rgbecker $ '''8__version__=''' $Id: signsandsymbols.py 3959 2012-09-27 14:39:39Z robin $ '''
9__doc__="""This file is a collection of widgets to produce some common signs and symbols.9__doc__="""This file is a collection of widgets to produce some common signs and symbols.
1010
11Widgets include:11Widgets include:
1212
=== modified file 'src/reportlab/graphics/widgets/table.py'
--- src/reportlab/graphics/widgets/table.py 2010-02-16 23:32:55 +0000
+++ src/reportlab/graphics/widgets/table.py 2013-04-14 00:52:26 +0000
@@ -1,8 +1,8 @@
1#!/usr/bin/env python1#!/usr/bin/env python
2#Copyright ReportLab Europe Ltd. 2000-20042#Copyright ReportLab Europe Ltd. 2000-2012
3#see license.txt for license details3#see license.txt for license details
4#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/widgets/grids.py4#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/widgets/grids.py
5__version__=''' $Id: table.py 3559 2009-09-22 11:27:25Z meitham $ '''5__version__=''' $Id: table.py 3959 2012-09-27 14:39:39Z robin $ '''
66
7from reportlab.graphics.widgetbase import Widget7from reportlab.graphics.widgetbase import Widget
8from reportlab.graphics.charts.textlabels import Label8from reportlab.graphics.charts.textlabels import Label
99
=== modified file 'src/reportlab/lib/PyFontify.py'
--- src/reportlab/lib/PyFontify.py 2010-12-06 12:45:44 +0000
+++ src/reportlab/lib/PyFontify.py 2013-04-14 00:52:26 +0000
@@ -1,6 +1,6 @@
1#Copyright ReportLab Europe Ltd. 2000-20081#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3__version__=''' $Id: PyFontify.py 3660 2010-02-08 18:17:33Z damian $ '''3__version__=''' $Id: PyFontify.py 3959 2012-09-27 14:39:39Z robin $ '''
4__doc__="""4__doc__="""
5Module to analyze Python source code; for syntax coloring tools.5Module to analyze Python source code; for syntax coloring tools.
66
77
=== modified file 'src/reportlab/lib/__init__.py'
--- src/reportlab/lib/__init__.py 2010-12-06 12:45:44 +0000
+++ src/reportlab/lib/__init__.py 2013-04-14 00:52:26 +0000
@@ -1,7 +1,7 @@
1#!/bin/env python1#!/bin/env python
2#Copyright ReportLab Europe Ltd. 2000-20042#Copyright ReportLab Europe Ltd. 2000-2012
3#see license.txt for license details3#see license.txt for license details
4#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/lib/__init__.py4#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/lib/__init__.py
5__version__=''' $Id: __init__.py 3660 2010-02-08 18:17:33Z damian $ '''5__version__=''' $Id: __init__.py 3959 2012-09-27 14:39:39Z robin $ '''
6import os6import os
7RL_DEBUG = 'RL_DEBUG' in os.environ7RL_DEBUG = 'RL_DEBUG' in os.environ
88
=== modified file 'src/reportlab/lib/abag.py'
--- src/reportlab/lib/abag.py 2010-02-16 23:32:55 +0000
+++ src/reportlab/lib/abag.py 2013-04-14 00:52:26 +0000
@@ -1,7 +1,7 @@
1#Copyright ReportLab Europe Ltd. 2000-20101#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/lib/abag.py3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/lib/abag.py
4__version__=''' $Id: abag.py 3623 2009-12-17 16:18:34Z andy $ '''4__version__=''' $Id: abag.py 3959 2012-09-27 14:39:39Z robin $ '''
5__doc__='''Data structure to hold a collection of attributes, used by styles.'''5__doc__='''Data structure to hold a collection of attributes, used by styles.'''
6class ABag:6class ABag:
7 """7 """
88
=== modified file 'src/reportlab/lib/arciv.py'
--- src/reportlab/lib/arciv.py 2009-02-22 14:19:44 +0000
+++ src/reportlab/lib/arciv.py 2013-04-14 00:52:26 +0000
@@ -1,9 +1,9 @@
1#copyright ReportLab Europe Limited. 2000-20061#copyright ReportLab Europe Limited. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3'''3'''
4Arciv Stream ciphering4Arciv Stream ciphering
5'''5'''
6__version__=''' $Id: arciv.py 3386 2009-01-22 14:21:27Z rgbecker $ '''6__version__=''' $Id: arciv.py 3959 2012-09-27 14:39:39Z robin $ '''
7from types import StringType7from types import StringType
8class ArcIV:8class ArcIV:
9 '''9 '''
1010
=== modified file 'src/reportlab/lib/attrmap.py'
--- src/reportlab/lib/attrmap.py 2010-12-06 12:45:44 +0000
+++ src/reportlab/lib/attrmap.py 2013-04-14 00:52:26 +0000
@@ -1,7 +1,7 @@
1#Copyright ReportLab Europe Ltd. 2000-20041#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/lib/attrmap.py3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/lib/attrmap.py
4__version__=''' $Id: attrmap.py 3660 2010-02-08 18:17:33Z damian $ '''4__version__=''' $Id: attrmap.py 3959 2012-09-27 14:39:39Z robin $ '''
5__doc__='''Framework for objects whose assignments are checked. Used by graphics.5__doc__='''Framework for objects whose assignments are checked. Used by graphics.
66
7We developed reportlab/graphics prior to Python 2 and metaclasses. For the7We developed reportlab/graphics prior to Python 2 and metaclasses. For the
88
=== modified file 'src/reportlab/lib/boxstuff.py'
--- src/reportlab/lib/boxstuff.py 2009-02-22 14:19:44 +0000
+++ src/reportlab/lib/boxstuff.py 2013-04-14 00:52:26 +0000
@@ -1,6 +1,6 @@
1#Copyright ReportLab Europe Ltd. 2000-20061#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3__version__=''' $Id: boxstuff.py 3408 2009-01-28 12:25:33Z rptlab $ '''3__version__=''' $Id: boxstuff.py 3959 2012-09-27 14:39:39Z robin $ '''
4__doc__='''Utility functions to position and resize boxes within boxes'''4__doc__='''Utility functions to position and resize boxes within boxes'''
55
6def aspectRatioFix(preserve,anchor,x,y,width,height,imWidth,imHeight):6def aspectRatioFix(preserve,anchor,x,y,width,height,imWidth,imHeight):
77
=== modified file 'src/reportlab/lib/codecharts.py'
--- src/reportlab/lib/codecharts.py 2009-02-22 14:19:44 +0000
+++ src/reportlab/lib/codecharts.py 2013-04-14 00:52:26 +0000
@@ -1,4 +1,4 @@
1#Copyright ReportLab Europe Ltd. 2000-20041#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/lib/codecharts.py3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/lib/codecharts.py
4#$Header $4#$Header $
55
=== modified file 'src/reportlab/lib/colors.py'
--- src/reportlab/lib/colors.py 2010-12-06 12:45:44 +0000
+++ src/reportlab/lib/colors.py 2013-04-14 00:52:26 +0000
@@ -1,7 +1,7 @@
1#Copyright ReportLab Europe Ltd. 2000-20101#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/lib/colors.py3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/lib/colors.py
4__version__=''' $Id: colors.py 3780 2010-09-17 13:40:59Z rgbecker $ '''4__version__=''' $Id: colors.py 3959 2012-09-27 14:39:39Z robin $ '''
5__doc__='''Defines standard colour-handling classes and colour names.5__doc__='''Defines standard colour-handling classes and colour names.
66
7We define standard classes to hold colours in two models: RGB and CMYK.7We define standard classes to hold colours in two models: RGB and CMYK.
@@ -12,8 +12,34 @@
12- pre-built colours used in ReportLab's branding12- pre-built colours used in ReportLab's branding
1313
14- various conversion and construction functions14- various conversion and construction functions
15
16These tests are here because doctest cannot find them otherwise.
17>>> toColor('rgb(128,0,0)')==toColor('rgb(50%,0%,0%)')
18True
19>>> toColor('rgb(50%,0%,0%)')!=Color(0.5,0,0,1)
20True
21>>> toColor('hsl(0,100%,50%)')==toColor('rgb(255,0,0)')
22True
23>>> toColor('hsl(-120,100%,50%)')==toColor('rgb(0,0,255)')
24True
25>>> toColor('hsl(120,100%,50%)')==toColor('rgb(0,255,0)')
26True
27>>> toColor('rgba( 255,0,0,0.5)')==Color(1,0,0,0.5)
28True
29>>> toColor('cmyk(1,0,0,0 )')==CMYKColor(1,0,0,0)
30True
31>>> toColor('pcmyk( 100 , 0 , 0 , 0 )')==PCMYKColor(100,0,0,0)
32True
33>>> toColor('cmyka(1,0,0,0,0.5)')==CMYKColor(1,0,0,0,alpha=0.5)
34True
35>>> toColor('pcmyka(100,0,0,0,0.5)')==PCMYKColor(100,0,0,0,alpha=0.5)
36True
37>>> toColor('pcmyka(100,0,0,0)')
38Traceback (most recent call last):
39 ....
40ValueError: css color 'pcmyka(100,0,0,0)' has wrong number of components
15'''41'''
16import math42import math, re
17from reportlab.lib.utils import fp_str43from reportlab.lib.utils import fp_str
1844
19class Color:45class Color:
@@ -70,6 +96,14 @@
70 def hexvala(self):96 def hexvala(self):
71 return '0x%02x%02x%02x%02x' % self.bitmap_rgba()97 return '0x%02x%02x%02x%02x' % self.bitmap_rgba()
7298
99 def int_rgb(self):
100 v = self.bitmap_rgb()
101 return v[0]<<16|v[1]<<8|v[2]
102
103 def int_rgba(self):
104 v = self.bitmap_rgba()
105 return int((v[0]<<24|v[1]<<16|v[2]<<8|v[3])&0xffffff)
106
73 _cKwds='red green blue alpha'.split()107 _cKwds='red green blue alpha'.split()
74 def cKwds(self):108 def cKwds(self):
75 for k in self._cKwds:109 for k in self._cKwds:
@@ -706,6 +740,8 @@
706 m1 = l*2-m2740 m1 = l*2-m2
707 return hue2rgb(m1, m2, h+1./3),hue2rgb(m1, m2, h),hue2rgb(m1, m2, h-1./3)741 return hue2rgb(m1, m2, h+1./3),hue2rgb(m1, m2, h),hue2rgb(m1, m2, h-1./3)
708742
743import re
744_re_css = re.compile(r'^\s*(pcmyk|cmyk|rgb|hsl)(a|)\s*\(\s*([^)]*)\)\s*$')
709class cssParse:745class cssParse:
710 def pcVal(self,v):746 def pcVal(self,v):
711 v = v.strip()747 v = v.strip()
@@ -746,32 +782,16 @@
746 except:782 except:
747 raise ValueError('bad %s argument value %r in css color %r' % (n,v,self.s))783 raise ValueError('bad %s argument value %r in css color %r' % (n,v,self.s))
748784
785 _n_c = dict(pcmyk=(4,100,True,False),cmyk=(4,1,True,False),hsl=(3,1,False,True),rgb=(3,1,False,False))
786
749 def __call__(self,s):787 def __call__(self,s):
750 s = s.strip()788 n = _re_css.match(s)
751 hsl = s.startswith('hsl')789 if not n: return
752 rgb = s.startswith('rgb')
753 cmyk = s.startswith('cmyk')
754 c = 1
755 if hsl: n = 3
756 if rgb: n = 3
757 if cmyk:
758 n = 4
759 else:
760 cmyk = s.startswith('pcmyk')
761 if cmyk:
762 n = 5
763 c = 100
764 if not (rgb or hsl or cmyk): return None
765 self.s = s790 self.s = s
766 n = s[n:]791 b,c,cmyk,hsl = self._n_c[n.group(1)]
767 ha = n.startswith('a')792 ha = n.group(2)
768 n = n[(ha and 1 or 0):].strip()793 n = n.group(3).split(',') #strip parens and split on comma
769 if not n.startswith('(') or not n.endswith(')'):794 if len(n)!=(b+(ha and 1 or 0)):
770 raise ValueError('improperly formatted css style color %r' % s)
771 n = n[1:-1].split(',') #strip parens and split on comma
772 a = len(n)
773 b = cmyk and 4 or 3
774 if ha and a!=(b+1) or not ha and a!=b:
775 raise ValueError('css color %r has wrong number of components' % s)795 raise ValueError('css color %r has wrong number of components' % s)
776 if ha:796 if ha:
777 n,a = n[:b],self.alphaVal(n[b],c)797 n,a = n[:b],self.alphaVal(n[b],c)
@@ -805,26 +825,6 @@
805825
806 def __call__(self,arg,default=None):826 def __call__(self,arg,default=None):
807 '''try to map an arbitrary arg to a color instance827 '''try to map an arbitrary arg to a color instance
808 >>> toColor('rgb(128,0,0)')==toColor('rgb(50%,0%,0%)')
809 True
810 >>> toColor('rgb(50%,0%,0%)')!=Color(0.5,0,0,1)
811 True
812 >>> toColor('hsl(0,100%,50%)')==toColor('rgb(255,0,0)')
813 True
814 >>> toColor('hsl(-120,100%,50%)')==toColor('rgb(0,0,255)')
815 True
816 >>> toColor('hsl(120,100%,50%)')==toColor('rgb(0,255,0)')
817 True
818 >>> toColor('rgba(255,0,0,0.5)')==Color(1,0,0,0.5)
819 True
820 >>> toColor('cmyk(1,0,0,0)')==CMYKColor(1,0,0,0)
821 True
822 >>> toColor('pcmyk(100,0,0,0)')==PCMYKColor(100,0,0,0)
823 True
824 >>> toColor('cmyka(1,0,0,0,0.5)')==CMYKColor(1,0,0,0,alpha=0.5)
825 True
826 >>> toColor('pcmyka(100,0,0,0,0.5)')==PCMYKColor(100,0,0,0,alpha=0.5)
827 True
828 '''828 '''
829 if isinstance(arg,Color): return arg829 if isinstance(arg,Color): return arg
830 if isinstance(arg,(tuple,list)):830 if isinstance(arg,(tuple,list)):
@@ -914,7 +914,6 @@
914 else: b = black914 else: b = black
915 return linearlyInterpolatedColor(b, c, 0, 1, f)915 return linearlyInterpolatedColor(b, c, 0, 1, f)
916916
917
918def fade(aSpotColor, percentages):917def fade(aSpotColor, percentages):
919 """Waters down spot colors and returns a list of new ones918 """Waters down spot colors and returns a list of new ones
920919
921920
=== modified file 'src/reportlab/lib/corp.py'
--- src/reportlab/lib/corp.py 2010-12-06 12:45:44 +0000
+++ src/reportlab/lib/corp.py 2013-04-14 00:52:26 +0000
@@ -1,7 +1,7 @@
1#!/bin/env python1#!/bin/env python
2#Copyright ReportLab Europe Ltd. 2000-20042#Copyright ReportLab Europe Ltd. 2000-2012
3#see license.txt for license details3#see license.txt for license details
4__version__=''' $Id: corp.py 3786 2010-09-29 09:51:54Z rgbecker $ '''4__version__=''' $Id: corp.py 3959 2012-09-27 14:39:39Z robin $ '''
5__doc__="""Generate ReportLab logo in a variety of sizes and formats.5__doc__="""Generate ReportLab logo in a variety of sizes and formats.
66
77
88
=== modified file 'src/reportlab/lib/enums.py'
--- src/reportlab/lib/enums.py 2009-02-22 14:19:44 +0000
+++ src/reportlab/lib/enums.py 2013-04-14 00:52:26 +0000
@@ -1,7 +1,7 @@
1#Copyright ReportLab Europe Ltd. 2000-20041#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/lib/enums.py3#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/lib/enums.py
4__version__=''' $Id: enums.py 3342 2008-12-12 15:55:34Z andy $ '''4__version__=''' $Id: enums.py 3959 2012-09-27 14:39:39Z robin $ '''
5__doc__="""5__doc__="""
6Container for constants. Hardly used!6Container for constants. Hardly used!
7"""7"""
88
=== modified file 'src/reportlab/lib/extformat.py'
--- src/reportlab/lib/extformat.py 2010-12-06 12:45:44 +0000
+++ src/reportlab/lib/extformat.py 2013-04-14 00:52:26 +0000
@@ -1,6 +1,6 @@
1#Copyright ReportLab Europe Ltd. 2000-20101#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3__version__='''$Id: extformat.py 3665 2010-02-09 15:55:45Z rgbecker $'''3__version__='''$Id: extformat.py 3959 2012-09-27 14:39:39Z robin $'''
4__doc__='''Apparently not used anywhere, purpose unknown!'''4__doc__='''Apparently not used anywhere, purpose unknown!'''
5from tokenize import tokenprog5from tokenize import tokenprog
6import sys6import sys
77
=== modified file 'src/reportlab/lib/fontfinder.py'
--- src/reportlab/lib/fontfinder.py 2010-12-06 12:45:44 +0000
+++ src/reportlab/lib/fontfinder.py 2013-04-14 00:52:26 +0000
@@ -1,6 +1,6 @@
1#Copyright ReportLab Europe Ltd. 2000-20071#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3__version__=''' $Id: fontfinder.py 3660 2010-02-08 18:17:33Z damian $ '''3__version__=''' $Id: fontfinder.py 3959 2012-09-27 14:39:39Z robin $ '''
44
5#modification of users/robin/ttflist.py.5#modification of users/robin/ttflist.py.
6__doc__="""This provides some general-purpose tools for finding fonts.6__doc__="""This provides some general-purpose tools for finding fonts.
77
=== modified file 'src/reportlab/lib/fonts.py'
--- src/reportlab/lib/fonts.py 2010-12-06 12:45:44 +0000
+++ src/reportlab/lib/fonts.py 2013-04-14 00:52:26 +0000
@@ -1,8 +1,8 @@
1#!/bin/env python1#!/bin/env python
2#Copyright ReportLab Europe Ltd. 2000-20042#Copyright ReportLab Europe Ltd. 2000-2012
3#see license.txt for license details3#see license.txt for license details
4#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/lib/fonts.py4#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/lib/fonts.py
5__version__=''' $Id: fonts.py 3702 2010-04-14 17:13:41Z rgbecker $ '''5__version__=''' $Id: fonts.py 3959 2012-09-27 14:39:39Z robin $ '''
6__doc__='''Utilities to associate bold and italic versions of fonts into families6__doc__='''Utilities to associate bold and italic versions of fonts into families
77
8Bold, italic and plain fonts are usually implemented in separate disk files;8Bold, italic and plain fonts are usually implemented in separate disk files;
99
=== modified file 'src/reportlab/lib/formatters.py'
--- src/reportlab/lib/formatters.py 2008-10-19 23:16:31 +0000
+++ src/reportlab/lib/formatters.py 2013-04-14 00:52:26 +0000
@@ -1,9 +1,9 @@
1#!/bin/env python1#!/bin/env python
2#Copyright ReportLab Europe Ltd. 2000-20042#Copyright ReportLab Europe Ltd. 2000-2012
3#see license.txt for license details3#see license.txt for license details
4#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/lib/formatters.py4#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/lib/formatters.py
5__all__=('Formatter','DecimalFormatter')5__all__=('Formatter','DecimalFormatter')
6__version__=''' $Id: formatters.py 3155 2007-10-05 10:55:52Z rgbecker $ '''6__version__=''' $Id: formatters.py 3959 2012-09-27 14:39:39Z robin $ '''
7__doc__="""7__doc__="""
8These help format numbers and dates in a user friendly way.8These help format numbers and dates in a user friendly way.
9Used by the graphics framework.9Used by the graphics framework.
1010
=== modified file 'src/reportlab/lib/geomutils.py'
--- src/reportlab/lib/geomutils.py 2009-02-22 14:19:44 +0000
+++ src/reportlab/lib/geomutils.py 2013-04-14 00:52:26 +0000
@@ -1,6 +1,6 @@
1#Copyright ReportLab Europe Ltd. 2000-20061#Copyright ReportLab Europe Ltd. 2000-2012
2#see license.txt for license details2#see license.txt for license details
3__version__=''' $Id: geomutils.py 3355 2009-01-08 14:58:44Z jonas $ '''3__version__=''' $Id: geomutils.py 3959 2012-09-27 14:39:39Z robin $ '''
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches

to all changes: