From e056e898cc1f5af6c6f61bc4a6eee8b57a414b69 Mon Sep 17 00:00:00 2001 From: John Evans Date: Mon, 27 May 2013 00:10:10 -0400 Subject: [PATCH] Initial commit. --- CHANGES.txt | 0 MANIFEST | 14 + README | 9 + TODO | 4 + bin/jp2dump | 15 + docs/Makefile | 153 + docs/make.bat | 190 + docs/source/api.rst | 5 + docs/source/conf.py | 248 + docs/source/how_do_i.rst | 24 + docs/source/index.rst | 25 + docs/source/introduction.rst | 187 + glymur/__init__.py | 99 + glymur/codestream.py | 1714 +++++++ glymur/core.py | 123 + glymur/data/nemo.jp2 | Bin 0 -> 1133504 bytes glymur/jp2box.py | 1763 +++++++ glymur/jp2dump.py | 22 + glymur/jp2k.py | 671 +++ glymur/lib/__init__.py | 3 + glymur/lib/openjp2.py | 1309 +++++ glymur/lib/test/__init__.py | 1 + glymur/lib/test/test_openjp2.py | 400 ++ glymur/test/__init__.py | 7 + glymur/test/test_callbacks.py | 72 + glymur/test/test_codestream.py | 92 + glymur/test/test_jp2k.py | 602 +++ glymur/test/test_opj_suite.py | 7364 +++++++++++++++++++++++++++ glymur/test/test_opj_suite_neg.py | 154 + glymur/test/test_opj_suite_write.py | 809 +++ glymur/test/test_printing.py | 767 +++ setup.py | 28 + 32 files changed, 16874 insertions(+) create mode 100644 CHANGES.txt create mode 100644 MANIFEST create mode 100644 README create mode 100644 TODO create mode 100755 bin/jp2dump create mode 100644 docs/Makefile create mode 100644 docs/make.bat create mode 100644 docs/source/api.rst create mode 100644 docs/source/conf.py create mode 100644 docs/source/how_do_i.rst create mode 100644 docs/source/index.rst create mode 100644 docs/source/introduction.rst create mode 100644 glymur/__init__.py create mode 100644 glymur/codestream.py create mode 100644 glymur/core.py create mode 100644 glymur/data/nemo.jp2 create mode 100644 glymur/jp2box.py create mode 100644 glymur/jp2dump.py create mode 100644 glymur/jp2k.py create mode 100644 glymur/lib/__init__.py create mode 100644 glymur/lib/openjp2.py create mode 100644 glymur/lib/test/__init__.py create mode 100644 glymur/lib/test/test_openjp2.py create mode 100644 glymur/test/__init__.py create mode 100644 glymur/test/test_callbacks.py create mode 100644 glymur/test/test_codestream.py create mode 100644 glymur/test/test_jp2k.py create mode 100644 glymur/test/test_opj_suite.py create mode 100644 glymur/test/test_opj_suite_neg.py create mode 100644 glymur/test/test_opj_suite_write.py create mode 100644 glymur/test/test_printing.py create mode 100644 setup.py diff --git a/CHANGES.txt b/CHANGES.txt new file mode 100644 index 0000000..e69de29 diff --git a/MANIFEST b/MANIFEST new file mode 100644 index 0000000..49ff165 --- /dev/null +++ b/MANIFEST @@ -0,0 +1,14 @@ +# file GENERATED by distutils, do NOT edit +README +setup.py +jptools/__init__.py +jptools/codestream.py +jptools/core.py +jptools/jp2box.py +jptools/jp2k.py +jptools/data/emneck.jp2 +jptools/test/__init__.py +jptools/test/test_codestream.py +jptools/test/test_conformance.py +jptools/test/test_jp2k.py +jptools/test/test_printing.py diff --git a/README b/README new file mode 100644 index 0000000..b11718c --- /dev/null +++ b/README @@ -0,0 +1,9 @@ +JPTOOLS +======= + +JPTOOLS provides a suite of JPEG2000 tools, including a bridge from Python to +the OpenJPEG library. + +Please read the docs. +===================== +Yes. Please. diff --git a/TODO b/TODO new file mode 100644 index 0000000..48883ad --- /dev/null +++ b/TODO @@ -0,0 +1,4 @@ +Test -c options with multiple values. +Test -b options with h*w>4096 +Test -b options with h or w > 1024 +Test -b options with h or w < 4 diff --git a/bin/jp2dump b/bin/jp2dump new file mode 100755 index 0000000..cb05c44 --- /dev/null +++ b/bin/jp2dump @@ -0,0 +1,15 @@ +#!/usr/bin/env python + +import argparse +import sys +import glymur + +description='Print JPEG2000 metadata.' +parser = argparse.ArgumentParser(description=description) +parser.add_argument('-c', '--codestream', help='dump codestream', + action='store_true') +parser.add_argument('filename') +args = parser.parse_args() + +filename = args.filename +glymur.jp2dump(args.filename, codestream=args.codestream) diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..f12a571 --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,153 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = build + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + -rm -rf $(BUILDDIR)/* + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/glymur.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/glymur.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/glymur" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/glymur" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..17a5342 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,190 @@ +@ECHO OFF + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set BUILDDIR=build +set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source +set I18NSPHINXOPTS=%SPHINXOPTS% source +if NOT "%PAPER%" == "" ( + set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% + set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% +) + +if "%1" == "" goto help + +if "%1" == "help" ( + :help + echo.Please use `make ^` where ^ is one of + echo. html to make standalone HTML files + echo. dirhtml to make HTML files named index.html in directories + echo. singlehtml to make a single large HTML file + echo. pickle to make pickle files + echo. json to make JSON files + echo. htmlhelp to make HTML files and a HTML help project + echo. qthelp to make HTML files and a qthelp project + echo. devhelp to make HTML files and a Devhelp project + echo. epub to make an epub + echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter + echo. text to make text files + echo. man to make manual pages + echo. texinfo to make Texinfo files + echo. gettext to make PO message catalogs + echo. changes to make an overview over all changed/added/deprecated items + echo. linkcheck to check all external links for integrity + echo. doctest to run all doctests embedded in the documentation if enabled + goto end +) + +if "%1" == "clean" ( + for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i + del /q /s %BUILDDIR%\* + goto end +) + +if "%1" == "html" ( + %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/html. + goto end +) + +if "%1" == "dirhtml" ( + %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. + goto end +) + +if "%1" == "singlehtml" ( + %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. + goto end +) + +if "%1" == "pickle" ( + %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the pickle files. + goto end +) + +if "%1" == "json" ( + %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the JSON files. + goto end +) + +if "%1" == "htmlhelp" ( + %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run HTML Help Workshop with the ^ +.hhp project file in %BUILDDIR%/htmlhelp. + goto end +) + +if "%1" == "qthelp" ( + %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run "qcollectiongenerator" with the ^ +.qhcp project file in %BUILDDIR%/qthelp, like this: + echo.^> qcollectiongenerator %BUILDDIR%\qthelp\glymur.qhcp + echo.To view the help file: + echo.^> assistant -collectionFile %BUILDDIR%\qthelp\glymur.ghc + goto end +) + +if "%1" == "devhelp" ( + %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. + goto end +) + +if "%1" == "epub" ( + %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The epub file is in %BUILDDIR%/epub. + goto end +) + +if "%1" == "latex" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "text" ( + %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The text files are in %BUILDDIR%/text. + goto end +) + +if "%1" == "man" ( + %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The manual pages are in %BUILDDIR%/man. + goto end +) + +if "%1" == "texinfo" ( + %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. + goto end +) + +if "%1" == "gettext" ( + %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The message catalogs are in %BUILDDIR%/locale. + goto end +) + +if "%1" == "changes" ( + %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes + if errorlevel 1 exit /b 1 + echo. + echo.The overview file is in %BUILDDIR%/changes. + goto end +) + +if "%1" == "linkcheck" ( + %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck + if errorlevel 1 exit /b 1 + echo. + echo.Link check complete; look for any errors in the above output ^ +or in %BUILDDIR%/linkcheck/output.txt. + goto end +) + +if "%1" == "doctest" ( + %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest + if errorlevel 1 exit /b 1 + echo. + echo.Testing of doctests in the sources finished, look at the ^ +results in %BUILDDIR%/doctest/output.txt. + goto end +) + +:end diff --git a/docs/source/api.rst b/docs/source/api.rst new file mode 100644 index 0000000..8c9284e --- /dev/null +++ b/docs/source/api.rst @@ -0,0 +1,5 @@ +API +=== + +.. autoclass:: glymur.Jp2k + :members: diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100644 index 0000000..baafdd9 --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,248 @@ +# -*- coding: utf-8 -*- +# +# glymur documentation build configuration file, created by +# sphinx-quickstart on Sun May 26 11:29:54 2013. +# +# This file is execfile()d with the current directory set to its containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys, os + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ----------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +extensions = ['sphinx.ext.autodoc', 'sphinx.ext.doctest', + 'sphinx.ext.autosummary', + 'sphinx.ext.intersphinx', 'sphinx.ext.todo', 'numpydoc'] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'glymur' +copyright = u'2013, John Evans' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '0.1' +# The full version, including alpha/beta/rc tags. +release = '0.1.0.a1' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = [] + +# The reST default role (used for this markup: `text`) to use for all documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + + +# -- Options for HTML output --------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'default' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Output file base name for HTML help builder. +htmlhelp_basename = 'glymurdoc' + + +# -- Options for LaTeX output -------------------------------------------------- + +latex_elements = { +# The paper size ('letterpaper' or 'a4paper'). +#'papersize': 'letterpaper', + +# The font size ('10pt', '11pt' or '12pt'). +#'pointsize': '10pt', + +# Additional stuff for the LaTeX preamble. +#'preamble': '', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, documentclass [howto/manual]). +latex_documents = [ + ('index', 'glymur.tex', u'glymur Documentation', + u'John Evans', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output -------------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ('index', 'glymur', u'glymur Documentation', + [u'John Evans'], 1) +] + +# If true, show URL addresses after external links. +#man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------------ + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + ('index', 'glymur', u'glymur Documentation', + u'John Evans', 'glymur', 'One line description of project.', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' + + +# Example configuration for intersphinx: refer to the Python standard library. +intersphinx_mapping = {'http://docs.python.org/': None} diff --git a/docs/source/how_do_i.rst b/docs/source/how_do_i.rst new file mode 100644 index 0000000..2938255 --- /dev/null +++ b/docs/source/how_do_i.rst @@ -0,0 +1,24 @@ +************ +How do I...? +************ + +Display metadata? +================= +There are two ways. From the unix command line, the script **jp2dump** is +available.:: + + $ jp2dump /path/to/glymur/installation/data/nemo.jp2 + +From within Python, it is as simple as printing the Jp2k object, i.e.:: + + >>> import pkg_resources + >>> from glymur import Jp2k + >>> file = pkg_resources.resource_filename(glymur.__name__, "data/nemo.jp2") + >>> j = Jp2k(file) + >>> print(j) + +The primary emphasis is on JP2 metadata, but it is possible to +display raw codestream as well:: + + >>> print(j.get_codestream()) + diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 0000000..43632b4 --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,25 @@ +.. glymur documentation master file, created by + sphinx-quickstart on Thu Jan 24 16:44:44 2013. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to glymur's documentation! +=================================== + +Contents: + +.. toctree:: + :maxdepth: 2 + + introduction + api + how_do_i + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + diff --git a/docs/source/introduction.rst b/docs/source/introduction.rst new file mode 100644 index 0000000..1428afa --- /dev/null +++ b/docs/source/introduction.rst @@ -0,0 +1,187 @@ +========================================= +glymur: a Python interface for JPEG 2000 +========================================= + +**glymur** contains a Python interface to the OpenJPEG library +which allows linux and mac users to read and write JPEG 2000 files. For more +information about OpenJPEG, please consult http://www.openjpeg.org. **glymur** +should be considered to be alpha-quality software. + +**glymur** tries to support reading (including all metadata) and writing of +JP2 and J2C files. Writing J2C/JP2 files is currently limited to images that +can fit in memory, however. + +There is some very limited support for reading JPX +metadata. For instance, **asoc** and **labl** boxes are recognized, so GMLJP2 +metadata can be retrieved from such JPX files. + +------------ +Requirements +------------ +**glymur** works on Python 2.7 and 3.3. Python 3.3 is strongly recommended. + +OpenJPEG +======== +OpenJPEG must be built as a shared library. In addition, you +currently must compile OpenJPEG from the developmental source that +you can retrieve via subversion. As of this time of writing, svn +revision 2345 works. In addition, you should also retrieve their test data, as +you will need it when running **glymur**'s test suite. + +Earlier versions of OpenJPEG through the 2.0 official release are not supported. + +Be sure to have the following ports/RPMs/debs installed. + + * gcc + * gcc-c++ + * cmake + +You should build OpenJPEG with testing turned on. Consult the OpenJPEG +documentation on how to do this. If you use linux, make sure that you +have the following development packages installed + + * zlib-devel + * png-devel + * libtiff-devel + * lcms2-devel + +OS +== + +Mac OS X +-------- +All the necessary packages are available to use **glymur** with Python 3.3 via +MacPorts. A minimal set of ports includes + + * python33 + * py33-numpy + * py33-distribute + +To run all the testing, one of the following combinations of ports must +additionally be installed: + + * py33-scikit-image and either py33-Pillow or freeimage + * py33-matplotlib and py33-Pillow + +Linux +----- + +Fedora 18 +''''''''' +Fedora 18 ships with Python 3.3, so all the necessary RPMs are available to +meet the minimal set of requirements. + + * python3 + * python3-numpy + * python3-setuptools + * python3-matplotlib (for running tests) + * python3-matplotlib-tk (or whichever matplotlib backend you prefer) + +A few tests still will not run, however, unless one of the following +combinations of RPMs / Python packages is installed. + + * scikit-image and either Pillow or freeimage + * matplotlib and Pillow + +The 2nd route is probably the easiest, so go ahead and install **Pillow** +via **pip** since **Pillow** is not yet available in Fedora 18 default +repositories:: + + $ yum install python3-devel # pip needs this in order to compile Pillow + $ yum install python3-pip # First one must install pip of course! + $ pip-python3 install Pillow --user + $ export PYTHONPATH=$HOME/.local/lib/python3.3/site-packages:$PYTHONPATH + +Fedora 17 +''''''''' +Fedora 17 ships with Python 3.2 and 2.7, so these steps detail working with +2.7. + +Required RPMs include:: + + * python + * python-mock + * python-pip + * python-setuptools + * numpy + +In addition, you must install **contextlib2** via pip. + +A few tests still will not run, however, unless one of the following +combinations of RPMs / Python packages is installed. + + * scikit-image and either Pillow or freeimage + * matplotlib and Pillow + +**scikit-image** is not available in the Fedora 17 default repositories, but +it may be installed via **pip**:: + + $ yum install Cython # pip needs this in order to compile scikit-image + $ yum install python-devel # pip needs this in order to compile scikit-image + $ yum install freeimage # scikit-image uses this as a backend + $ yum install scipy # needed by scikit-image + $ pip-python install scikit-image --user + $ pip-python install contextlib2 --user + $ export PYTHONPATH=$HOME/.local/lib/python2.7/site-packages:$PYTHONPATH + +Windows +------- +Not currently supported. + +------------------------------------ +Installation, Testing, Configuration +------------------------------------ + +From this point forward, python3 will be referred to as just "python". + +Installation +============ + +In addition to merely installing **glymur**, you should adjust your **$PATH** +environment variable in order to be able to use the **jp2dump** script from +the unix command line. + +:: + + $ python setup.py install --prefix=/install/path + $ export PYTHONPATH=/install/path/lib/python3.3/site-packages + $ export PATH=/install/path/bin:$PATH + + +Configuration +============= +glymur uses **ctypes** (for the moment) to access the openjp2 library, and +because **ctypes** access libraries in a platform-dependent manner, it is +recommended that you create a configuration file to help glymur properly find +the openjp2 library. You may create the configuration file as follows:: + + $ mkdir ~/.glymur + $ cd ~/.glymur + $ cat > glymurrc << EOF + > [library] + > openjp2: /opt/openjp2-svn/lib/libopenjp2.so + > EOF + +That assumes, of course, that you've installed OpenJPEG into /opt/openjp2-svn. + + +Testing +======= +In order to run all of the test suite, you will first need the OpenJPEG test +data that you previously retrieved. +Then you should set the **OPJ_DATA_ROOT** environment variable to +point to this directory, e.g.:: + + $ cd /somewhere/outside/the/glymur/unpacking/directory + $ svn co http://openjpeg.googlecode.com/svn/data + $ export OPJ_DATA_ROOT=`pwd`/data + +The test suite may then be run with:: + + $ cd /back/to/glymur/unpacking/directory + $ python -m unittest discover + +At the moment, the development version of the library prints quite a few +warnings to stderr, which you may ignore. There are also more skipped tests +on Python 2.7 than on Python 3.3. The important thing will be whether +or not any test errors are reported at the end. diff --git a/glymur/__init__.py b/glymur/__init__.py new file mode 100644 index 0000000..e5f0350 --- /dev/null +++ b/glymur/__init__.py @@ -0,0 +1,99 @@ +"""glymur - read, write, and interrogate JPEG 2000 files +""" + + +def _glymurrc_fname(): + """Return the path to the configuration file. + + Search order: + 1) current working directory + 2) environ var GLYMURCONFIGDIR + 3) HOME/.glymur/glymurrc + """ + + # Current directory. + fname = os.path.join(os.getcwd(), 'glymurrc') + if os.path.exists(fname): + return fname + + # environ var GLYMURCONFIGDIR + if 'GLYMURCONFIGDIR' in os.environ: + path = os.environ['GLYMURCONFIGDIR'] + if os.path.exists(path): + fname = os.path.join(path, 'glymurrc') + if os.path.exists(fname): + return fname + + # HOME/.glymur/jptoolrsc + confdir = _get_configdir() + if confdir is not None: + fname = os.path.join(_get_configdir(), 'glymurrc') + if os.path.exists(fname): + return fname + + # didn't find a configuration file. + return None + + +def _config(): + """Read configuration file. + + Based on matplotlib. + """ + filename = _glymurrc_fname() + if filename is not None: + # Read the configuration file for the library location. + parser = ConfigParser() + parser.read(filename) + try: + libopenjp2_path = parser.get('library', 'openjp2') + if not os.path.exists(libopenjp2_path): + msg = 'OpenJP2 library path specified by configuration file ' + msg += 'does not exist.' + raise ImportError(msg) + except NoOptionError as e: + msg = "Error parsing configuration file '{0}': {1}" + msg = msg.format(fname, e.message) + warnings.warn(msg, UserWarning) + except: + raise + else: + # No help from the config file, try to find it ourselves. + from ctypes.util import find_library + libopenjp2_path = find_library('openjp2') + if libopenjp2_path is None: + raise ImportError('OpenJP2 library not found.') + + _OPENJP2 = ctypes.CDLL(libopenjp2_path) + return _OPENJP2 + + +def _get_configdir(): + """Return string representing the configuration directory. + + Default is HOME/.glymur. You can override this with the GLYMURCONFIGDIR + environment variable. + """ + + if 'GLYMURCONFIGDIR' in os.environ: + return os.environ['GLYMURCONFIGDIR'] + + if 'HOME' in os.environ: + return os.path.join(os.environ['HOME'], '.glymur') + +import sys +if sys.hexversion <= 0x03000000: + from ConfigParser import SafeConfigParser as ConfigParser + from ConfigParser import NoOptionError +else: + from configparser import ConfigParser + from configparser import NoOptionError +import ctypes +import os + +_OPENJP2 = _config() + +from .jp2k import Jp2k +from .jp2dump import jp2dump + +from . import test diff --git a/glymur/codestream.py b/glymur/codestream.py new file mode 100644 index 0000000..506450d --- /dev/null +++ b/glymur/codestream.py @@ -0,0 +1,1714 @@ +"""Codestream information. + +The module contains classes used to store information parsed from JPEG 2000 +codestreams. +""" + +import math +import struct +import sys +import warnings + +import numpy as np + +from .core import _progression_order_display +from .core import _wavelet_transform_display +from .core import _capabilities_display +from .lib import openjp2 as opj2 + +# Need a catch-all list of valid markers. +# See table A-1 in ISO/IEC FCD15444-1. +_valid_markers = [0xff00, 0xff01, 0xfffe] +for _marker in range(0xffc0, 0xffe0): + _valid_markers.append(_marker) +for _marker in range(0xfff0, 0xfff9): + _valid_markers.append(_marker) +for _marker in range(0xff4f, 0xff70): + _valid_markers.append(_marker) +for _marker in range(0xff90, 0xff94): + _valid_markers.append(_marker) + + +class Codestream: + """Container for codestream information. + + Attributes + ---------- + segment : list of marker segments + + Raises + ------ + IOError + If the file does not parse properly. + + References + ---------- + .. [JP2K15444-1i] International Organization for Standardication. ISO/IEC + 15444-1:2004 - Information technology -- JPEG 2000 image coding system: + Core coding system + """ + def __init__(self, f, header_only=True): + """ + Parameters + ---------- + f : file + Open file object. + header_only : bool, optional + If True, only marker segments in the main header are parsed. + Supplying False may impose a large performance penalty. + """ + + self._parse_tile_part_bit_stream_flag = False + + self.segment = [] + + # First two bytes are the SOC marker + buffer = f.read(2) + marker_id, = struct.unpack('>H', buffer) + segment = SOCsegment(offset=f.tell() - 2, length=0) + self.segment.append(segment) + + tile_offset = [] + tile_length = [] + + while True: + offset = f.tell() + buffer = f.read(2) + marker_id, = struct.unpack('>H', buffer) + + if marker_id >= 0xff30 and marker_id <= 0xff3f: + the_id = '0x{0:x}'.format(marker_id) + segment = Segment(id=the_id, offset=offset, length=0) + + elif marker_id == 0xff51: + # Need to keep track of the number of components from SIZ for + # other markers + segment = self._parseSIZsegment(f) + self._Csiz = len(segment.Ssiz) + + elif marker_id == 0xff52: + segment = self._parseCODsegment(f) + + elif marker_id == 0xff53: + segment = self._parseCOCsegment(f) + + elif marker_id == 0xff55: + segment = self._parseTLMsegment(f) + + elif marker_id == 0xff58: + segment = self._parsePLTsegment(f) + + elif marker_id == 0xff5c: + segment = self._parseQCDsegment(f) + + elif marker_id == 0xff5d: + segment = self._parseQCCsegment(f) + + elif marker_id == 0xff5e: + segment = self._parseRGNsegment(f) + + elif marker_id == 0xff5f: + segment = self._parsePODsegment(f) + + elif marker_id == 0xff60: + segment = self._parsePPMsegment(f) + + elif marker_id == 0xff61: + segment = self._parsePPTsegment(f) + + elif marker_id == 0xff63: + segment = self._parseCRGsegment(f) + + elif marker_id == 0xff64: + segment = self._parseCMEsegment(f) + + elif marker_id == 0xff90: + # Need to keep easy access to tile offsets and lengths for when + # we encounter start-of-data marker segments. + if header_only: + # Stop parsing as soon as we hit the first Start Of Tile. + return + + segment = self._parseSOTsegment(f) + if segment.offset not in tile_offset: + tile_offset.append(segment.offset) + tile_length.append(segment.Psot) + else: + msg = "Inconsistent start-of-tile (SOT) marker segment " + msg += "encountered in tile with index {0}. " + msg += "Codestream parsing terminated." + msg = msg.format(segment.Isot) + warnings.warn(msg) + return + + elif marker_id == 0xff93: + # start of data. Need to seek past the current tile part. + # The last SOT marker segment has the info that we need. + segment = self._parseSODsegment(f) + + elif marker_id == 0xffd9: + # end of codestream + segment = self._parseEOCsegment(f) + self.segment.append(segment) + break + + elif marker_id in _valid_markers: + # It's a reserved marker that I don't know anything about. + # See table A-1 in ISO/IEC FCD15444-1. + segment = self._parseGenericSegment(f, marker_id) + + elif ((marker_id & 0xff00) >> 8) == 255: + # Peek ahead to see if the next two bytes are a marker or not. + # Then seek back. + msg = "Unrecognized marker id: 0x{0:x}".format(marker_id) + warnings.warn(msg) + cpos = f.tell() + buffer = f.read(2) + next_item, = struct.unpack('>H', buffer) + f.seek(cpos) + if ((next_item & 0xff00) >> 8) == 255: + # No segment associated with this marker, so reset + # to two bytes after it. + segment = Segment(id='0x{0:x}'.format(marker_id), + offset=offset, length=0) + else: + segment = self._parseGenericSegment(f, marker_id) + + else: + msg = 'Invalid marker id encountered at byte {0:d}' + msg += 'in codestream: "0x{1:x}"' + msg = msg.format(offset, marker_id) + raise IOError(msg) + + self.segment.append(segment) + + if marker_id == 0xff93: + # If SOD, then we need to seek past the tile part bit stream. + x = f.tell() + if self._parse_tile_part_bit_stream_flag: + # But first parse the tile part bit stream for SOP and + # EPH segments. + self._parse_tile_part_bit_stream(f, segment, + tile_length[-1]) + + f.seek(tile_offset[-1] + tile_length[-1]) + + def _parse_tile_part_bit_stream(self, f, sod_marker, tile_length): + """Parse the tile part bit stream for SOP, EPH marker segments.""" + buffer = f.read(tile_length) + # The tile length could possibly be too large and extend past + # the end of file. We need to be a bit resilient. + count = min(tile_length, len(buffer)) + packet = np.frombuffer(buffer, dtype=np.uint8, count=count) + + indices = np.where(packet == 0xff) + for idx in indices[0]: + try: + if packet[idx+1] == 0x91 and (idx < (len(packet) - 5)): + kwargs = {} + kwargs['offset'] = sod_marker.offset + 2 + idx + kwargs['length'] = 4 + nsop = packet[(idx + 4):(idx+6)].view('uint16')[0] + if sys.byteorder == 'little': + nsop = nsop.byteswap() + kwargs['Nsop'] = nsop + segment = SOPsegment(**kwargs) + self.segment.append(segment) + elif packet[idx + 1] == 0x92: + kwargs = {} + kwargs['offset'] = sod_marker.offset + 2 + idx + kwargs['length'] = 0 + segment = EPHsegment(**kwargs) + self.segment.append(segment) + except IndexError: + continue + + def __str__(self): + msg = 'Codestream:\n' + for segment in self.segment: + strs = segment.__str__() + + # Add indentation + strs = [(' ' + x + '\n') for x in strs.split('\n')] + msg += ''.join(strs) + return msg + + def _parseSIZsegment(self, f): + """Parse the SIZ segment. + + Parameters + ---------- + f : file + Open file object. + + Returns + ------- + SIZsegment instance. + """ + kwargs = {} + kwargs['offset'] = f.tell() - 2 + + buffer = f.read(38) + data = struct.unpack('>HHIIIIIIIIH', buffer) + + kwargs['length'] = data[0] + kwargs['Rsiz'] = data[1] + + Xsiz = data[2] + Ysiz = data[3] + XOsiz = data[4] + YOsiz = data[5] + XTsiz = data[6] + YTsiz = data[7] + XTOsiz = data[8] + YTOsiz = data[9] + + num_tiles_x = (Xsiz - XOsiz) / (XTsiz - XTOsiz) + num_tiles_y = (Ysiz - YOsiz) / (YTsiz - YTOsiz) + numtiles = math.ceil(num_tiles_x) * math.ceil(num_tiles_y) + if numtiles > 65535: + msg = "Invalid number of tiles ({0}).".format(numtiles) + warnings.warn(msg) + + kwargs['Xsiz'] = Xsiz + kwargs['Ysiz'] = Ysiz + kwargs['XOsiz'] = XOsiz + kwargs['YOsiz'] = YOsiz + kwargs['XTsiz'] = XTsiz + kwargs['YTsiz'] = YTsiz + kwargs['XTOsiz'] = XTOsiz + kwargs['YTOsiz'] = YTOsiz + + num_components = data[10] + buffer = f.read(num_components * 3) + data = struct.unpack('>' + 'B' * num_components * 3, buffer) + + Ssiz = data[0::3] + kwargs['Ssiz'] = Ssiz + kwargs['_bitdepth'] = tuple(((x & 0x7f) + 1) for x in Ssiz) + kwargs['_signed'] = tuple(((x & 0xb0) > 0) for x in Ssiz) + + ssf = [] + for j, subsampling in enumerate(list(zip(data[1::3], data[2::3]))): + if 0 in subsampling: + msg = "Invalid subsampling value for component {0}: " + msg += "dx={1}, dy={2}." + msg = msg.format(j, subsampling[0], subsampling[1]) + warnings.warn(msg) + kwargs['XRsiz'] = data[1::3] + kwargs['YRsiz'] = data[2::3] + + return SIZsegment(**kwargs) + + def _parseGenericSegment(self, f, marker_id): + """Parse a generic marker segment. + + Parameters + ---------- + f : file + Open file object. + + Returns + ------- + Segment instance. + """ + kwargs = {} + offset = f.tell() - 2 + + buffer = f.read(2) + length, = struct.unpack('>H', buffer) + data = f.read(length-2) + + segment = Segment(id='0x{0:x}'.format(marker_id), + offset=offset, length=length) + segment.data = data + return segment + + def _parseCMEsegment(self, f): + """Parse the CME marker segment. + + Parameters + ---------- + f : file + Open file object. + + Returns + ------- + CME segment instance. + """ + kwargs = {} + kwargs['offset'] = f.tell() - 2 + + buffer = f.read(4) + data = struct.unpack('>HH', buffer) + kwargs['length'] = data[0] + kwargs['Rcme'] = data[1] + kwargs['Ccme'] = f.read(kwargs['length'] - 4) + + return CMEsegment(**kwargs) + + def _parseCRGsegment(self, f): + """Parse the CRG marker segment. + + Parameters + ---------- + f : file + Open file object. + + Returns + ------- + CRG segment instance. + """ + kwargs = {} + kwargs['offset'] = f.tell() - 2 + + buffer = f.read(2) + length, = struct.unpack('>H', buffer) + kwargs['length'] = length + + buffer = f.read(4 * self._Csiz) + data = struct.unpack('>' + 'HH' * self._Csiz, buffer) + kwargs['Xcrg'] = data[0::2] + kwargs['Ycrg'] = data[1::2] + + return CRGsegment(**kwargs) + + def _parseEOCsegment(self, f): + """Parse the EOC marker segment. + + Parameters + ---------- + f : file + Open file object. + + Returns + ------- + EOC Segment instance. + """ + kwargs = {} + kwargs['offset'] = f.tell() - 2 + kwargs['length'] = 0 + + return EOCsegment(**kwargs) + + def _parseCOCsegment(self, f): + """Parse the COC marker segment. + + Parameters + ---------- + f : file + Open file object. + + Returns + ------- + COC segment instance. + """ + kwargs = {} + offset = f.tell() - 2 + kwargs['offset'] = offset + + buffer = f.read(2) + length, = struct.unpack('>H', buffer) + kwargs['length'] = length + + if self._Csiz <= 255: + buffer = f.read(1) + component, = struct.unpack('>B', buffer) + else: + buffer = f.read(2) + component, = struct.unpack('>H', buffer) + kwargs['Ccoc'] = component + + buffer = f.read(1) + kwargs['Scoc'], = struct.unpack('>B', buffer) + + n = offset + 2 + length - f.tell() + buffer = f.read(n) + SPcoc = np.frombuffer(buffer, dtype=np.uint8) + kwargs['SPcoc'] = SPcoc + + e1 = SPcoc[1] + e2 = SPcoc[2] + _code_block_size = (4 * math.pow(2, e2), 4 * math.pow(2, e1)) + kwargs['_code_block_size'] = _code_block_size + + if len(SPcoc) > 5: + kwargs['_precinct_size'] = _parse_precinct_size(SPcoc[5:]) + else: + kwargs['_precinct_size'] = None + + return COCsegment(**kwargs) + + def _parseCODsegment(self, f): + """Parse the COD segment. + + Parameters + ---------- + f : file + Open file object. + + Returns + ------- + COD segment instance. + """ + kwargs = {} + offset = f.tell() - 2 + kwargs['offset'] = f.tell() - 2 + + buffer = f.read(3) + length, Scod = struct.unpack('>HB', buffer) + kwargs['length'] = length + kwargs['Scod'] = Scod + + sop = (Scod & 2) > 0 + eph = (Scod & 4) > 0 + + if sop or eph: + self._parse_tile_part_bit_stream_flag = True + else: + self._parse_tile_part_bit_stream_flag = False + + n = offset + 2 + length - f.tell() + SPcod = f.read(n) + kwargs['SPcod'] = np.frombuffer(SPcod, dtype=np.uint8) + + # 0: + # 1: layers + params = struct.unpack('>BHBBBBBB', SPcod[0:9]) + kwargs['_layers'] = params[1] + kwargs['_numresolutions'] = params[3] + + if params[3] > opj2._J2K_MAXRLVLS: + msg = "Invalid number of resolutions ({0})." + msg = msg.format(params[3] + 1) + warnings.warn(msg) + + cblk_width = 4 * math.pow(2, params[4]) + cblk_height = 4 * math.pow(2, params[5]) + code_block_size = (cblk_height, cblk_width) + kwargs['_code_block_size'] = code_block_size + + if len(SPcod) > 9: + kwargs['_precinct_size'] = _parse_precinct_size(SPcod[9:]) + else: + kwargs['_precinct_size'] = None + + return CODsegment(**kwargs) + + def _parsePODsegment(self, f): + """Parse the POD segment. + + Parameters + ---------- + f : file + Open file object. + + Returns + ------- + POD segment instance. + """ + kwargs = {} + kwargs['offset'] = f.tell() - 2 + + buffer = f.read(2) + length, = struct.unpack('>H', buffer) + + if self._Csiz < 257: + n = int((length - 2) / 7) + buffer = f.read(n * 7) + fmt = '>' + 'BBHBBB' * n + else: + n = int((length - 2) / 9) + buffer = f.read(n * 9) + fmt = '>' + 'BHHBHB' * n + + data = struct.unpack(fmt, buffer) + + kwargs['length'] = length + kwargs['RSpod'] = data[0::6] + kwargs['CSpod'] = data[1::6] + kwargs['LYEpod'] = data[2::6] + kwargs['REpod'] = data[3::6] + kwargs['CEpod'] = data[4::6] + kwargs['Ppod'] = data[5::6] + + return PODsegment(**kwargs) + + def _parsePPMsegment(self, f): + """Parse the PPM segment. + + Parameters + ---------- + f : file + Open file object. + + Returns + ------- + PPM segment instance. + """ + kwargs = {} + kwargs['offset'] = f.tell() - 2 + + buffer = f.read(3) + length, zppm = struct.unpack('>HB', buffer) + kwargs['length'] = length + kwargs['Zppm'] = zppm + + n = length - 3 + kwargs['data'] = f.read(n) + + return PPMsegment(**kwargs) + + def _parsePLTsegment(self, f): + """Parse the PLT segment. + + The packet headers are not parsed, i.e. they remain "uninterpreted" + raw data beffers. + + Parameters + ---------- + f : file + Open file object. + + Returns + ------- + PLT segment instance. + """ + kwargs = {} + kwargs['offset'] = f.tell() - 2 + + buffer = f.read(3) + length, zplt = struct.unpack('>HB', buffer) + kwargs['length'] = length + kwargs['Zplt'] = zplt + + n = length - 3 + buffer = f.read(n) + iplt = np.frombuffer(buffer, dtype=np.uint8) + + packet_len = [] + plen = 0 + for x in iplt: + plen |= (x & 0x7f) + if x & 0x80: + # Continue by or-ing in the next byte. + plen <<= 7 + else: + packet_len.append(plen) + plen = 0 + + kwargs['Iplt'] = packet_len + + return PLTsegment(**kwargs) + + def _parsePPTsegment(self, f): + """Parse the PPT segment. + + The packet headers are not parsed, i.e. they remain "uninterpreted" + raw data beffers. + + Parameters + ---------- + f : file + Open file object. + + Returns + ------- + PPT segment instance. + """ + kwargs = {} + kwargs['offset'] = f.tell() - 2 + + buffer = f.read(3) + length, zppt = struct.unpack('>HB', buffer) + kwargs['length'] = length + kwargs['Zppt'] = zppt + + n = length - 3 + kwargs['Ippt'] = f.read(n) + + return PPTsegment(**kwargs) + + def _parseQuantization(self, buffer, sqcd): + """Tease out the quantization values. + + Args: + buffer: sequence of bytes from the QCC and QCD segments. + """ + n = len(buffer) + + exponent = [] + mantissa = [] + + if sqcd & 0x1f == 0: # no quantization + data = struct.unpack('>' + 'B' * n, buffer) + for j in range(len(data)): + exponent.append(data[j] >> 3) + mantissa.append(0) + else: + fmt = '>' + 'H' * int(n / 2) + data = struct.unpack(fmt, buffer) + for j in range(len(data)): + exponent.append(data[j] >> 11) + mantissa.append(data[j] & 0x07ff) + + return mantissa, exponent + + def _parseQCCsegment(self, f): + """Parse the QCC segment. + + Parameters + ---------- + f : file + Open file object. + + Returns + ------- + QCC Segment instance. + """ + kwargs = {} + offset = f.tell() - 2 + kwargs['offset'] = offset + + buffer = f.read(2) + length, = struct.unpack('>H', buffer) + kwargs['length'] = length + + if self._Csiz > 256: + buffer = f.read(3) + fmt = '>HB' + n = length - 5 + else: + buffer = f.read(2) + fmt = '>BB' + n = length - 4 + Cqcc, Sqcc = struct.unpack(fmt, buffer) + if Cqcc >= self._Csiz: + msg = "Invalid component number (%d), " + msg += "number of components is only %d." + msg = msg.format(Cqcc, self._Csiz) + warnings.warn(msg) + kwargs['Cqcc'] = Cqcc + + kwargs['Sqcc'] = Sqcc + kwargs['_guardBits'] = (Sqcc & 0xe0) >> 5 + + buffer = f.read(n) + + mantissa, exponent = self._parseQuantization(buffer, Sqcc) + + kwargs['SPqcc'] = buffer + kwargs['_exponent'] = exponent + kwargs['_mantissa'] = mantissa + + return QCCsegment(**kwargs) + + def _parseQCDsegment(self, f): + """Parse the QCD segment. + + Parameters + ---------- + f : file + Open file object. + + Returns + ------- + QCD Segment instance. + """ + kwargs = {} + kwargs['offset'] = f.tell() - 2 + + buffer = f.read(3) + length, sqcd = struct.unpack('>HB', buffer) + kwargs['length'] = length + kwargs['Sqcd'] = sqcd + + kwargs['_guardBits'] = (sqcd & 0xe0) >> 5 + + buffer = f.read(length - 3) + + mantissa, exponent = self._parseQuantization(buffer, sqcd) + + kwargs['SPqcd'] = buffer + kwargs['_exponent'] = exponent + kwargs['_mantissa'] = mantissa + + return QCDsegment(**kwargs) + + def _parseRGNsegment(self, f): + """Parse the RGN segment. + + Parameters + ---------- + f : file + Open file object. + + Returns + ------- + RGN segment instance. + """ + kwargs = {} + kwargs['offset'] = f.tell() - 2 + + buffer = f.read(2) + length, = struct.unpack('>H', buffer) + + if self._Csiz < 257: + buffer = f.read(3) + data = struct.unpack('>BBB', buffer) + else: + buffer = f.read(4) + data = struct.unpack('>HBB', buffer) + + kwargs['length'] = length + kwargs['Crgn'] = data[0] + kwargs['Srgn'] = data[1] + kwargs['SPrgn'] = data[2] + + return RGNsegment(**kwargs) + + def _parseSODsegment(self, f): + """Parse the SOD segment. + + Parameters + ---------- + f : file + Open file object. + + Returns + ------- + SOD segment instance. + """ + kwargs = {} + kwargs['offset'] = f.tell() - 2 + kwargs['length'] = 0 + + return SODsegment(**kwargs) + + def _parseSOTsegment(self, f): + """Parse the SOT segment. + + Parameters + ---------- + f : file + Open file object. + + Returns + ------- + SOT segment instance. + """ + kwargs = {} + kwargs['offset'] = f.tell() - 2 + + buffer = f.read(10) + data = struct.unpack('>HHIBB', buffer) + + kwargs['length'] = data[0] + kwargs['Isot'] = data[1] + kwargs['Psot'] = data[2] + kwargs['TPsot'] = data[3] + kwargs['TNsot'] = data[4] + + return SOTsegment(**kwargs) + + def _parseTLMsegment(self, f): + """Parse the TLM segment. + + Parameters + ---------- + f : file + Open file object. + + Returns + ------- + TLM segment instance. + """ + kwargs = {} + offset = f.tell() - 2 + kwargs['offset'] = offset + + buffer = f.read(2) + length, = struct.unpack('>H', buffer) + kwargs['length'] = length + + buffer = f.read(2) + Ztlm, Stlm = struct.unpack('>BB', buffer) + st = (Stlm >> 4) & 0x3 + sp = (Stlm >> 6) & 0x1 + + nbytes = length - 4 + if st == 0: + ntiles = nbytes / ((sp + 1) * 2) + else: + ntiles = nbytes / (st + (sp + 1) * 2) + + buffer = f.read(nbytes) + if st == 0: + Ttlm = None + fmt = '' + elif st == 1: + fmt = 'B' + elif st == 2: + fmt = 'H' + + if sp == 0: + fmt += 'H' + else: + fmt += 'I' + + data = struct.unpack('>' + fmt * int(ntiles), buffer) + if st == 0: + Ttlm = None + Ptlm = data + else: + Ttlm = data[0::2] + Ptlm = data[1::2] + + kwargs['Ztlm'] = Ztlm + kwargs['Ttlm'] = Ttlm + kwargs['Ptlm'] = Ptlm + + return TLMsegment(**kwargs) + + +class Segment: + """Segment information. + + Attributes + ---------- + id : str + Identifier for the segment. + offset : int + Offset of marker segment in bytes from beginning of file. + length : int + Length of marker segment in bytes. This number does not include the + two bytes constituting the marker. + """ + def __init__(self, id='', offset=-1, length=-1): + self.id = id + self.offset = offset + self.length = length + + def __str__(self): + msg = '{0} marker segment @ ({1}, {2})'.format(self.id, + self.offset, + self.length) + return msg + + def _print_quantization_style(self, sqcc): + """Only to be used with QCC and QCD segments.""" + + msg = '\n Quantization style: ' + if sqcc & 0x1f == 0: + msg += 'no quantization, ' + elif sqcc & 0x1f == 1: + msg += 'scalar implicit, ' + elif sqcc & 0x1f == 2: + msg += 'scalar explicit, ' + return msg + + +class COCsegment(Segment): + """COC (Coding style Component) segment information. + + Attributes + ---------- + id : str + Identifier for the segment. + offset : int + Offset of marker segment in bytes from beginning of file. + length : int + Length of marker segment in bytes. This number does not include the + two bytes constituting the marker. + Ccoc : byte + Index of associated component. + Scoc : byte + Coding style for this component. + SPcoc : byte array + Coding style parameters for this component. + + References + ---------- + .. [JP2K15444-1i] International Organization for Standardication. ISO/IEC + 15444-1:2004 - Information technology -- JPEG 2000 image coding system: + Core coding system + """ + def __init__(self, **kwargs): + Segment.__init__(self, id='COC') + self.__dict__.update(**kwargs) + + def __str__(self): + msg = Segment.__str__(self) + + msg += '\n Associated component: {0}'.format(self.Ccoc) + + msg += '\n Coding style for this component: ' + if self.Scoc == 0: + msg += 'Entropy coder, PARTITION = 0' + elif self.Scoc & 0x01: + msg += 'Entropy coder, PARTITION = 1' + + msg += '\n Coding style parameters:' + msg += '\n Number of resolutions: {0}' + msg += '\n Code block height, width: ({1} x {2})' + msg += '\n Wavelet transform: {3}' + msg = msg.format(self.SPcoc[0] + 1, + int(self._code_block_size[0]), + int(self._code_block_size[1]), + _wavelet_transform_display[self.SPcoc[4]]) + + msg += '\n ' + msg += _context_string(self.SPcoc[3]) + + if self._precinct_size is not None: + msg += '\n Precinct size: ' + for pps in self._precinct_size: + msg += '(%d, %d)'.format(pps) + + return msg + + +class CODsegment(Segment): + """COD segment information. + + Attributes + ---------- + id : str + Identifier for the segment. + offset : int + Offset of marker segment in bytes from beginning of file. + length : int + Length of marker segment in bytes. This number does not include the + two bytes constituting the marker. + Scod : int + Default coding style. + SPcod : bytes + Coding style parameters, including quality layers, multicomponent + transform usage, decomposition levels, code block size, style of code- + block passes, and which wavelet transform is used. + + References + ---------- + .. [JP2K15444-1i] International Organization for Standardication. ISO/IEC + 15444-1:2004 - Information technology -- JPEG 2000 image coding system: + Core coding system + """ + def __init__(self, **kwargs): + Segment.__init__(self, id='COD') + self.__dict__.update(**kwargs) + + def __str__(self): + msg = Segment.__str__(self) + + msg += '\n Coding style:' + msg += '\n Entropy coder, {0} partitions' + msg += '\n SOP marker segments: {1}' + msg += '\n EPH marker segments: {2}' + msg = msg.format('with' if (self.Scod & 1) else 'without', + ((self.Scod & 2) > 0), + ((self.Scod & 4) > 0)) + + if self.SPcod[3] == 0: + mct = 'no transform specified' + elif self.SPcod[3] & 0x01: + mct = 'reversible' + elif self.SPcod[3] & 0x02: + mct = 'irreversible' + else: + mct = 'unknown' + + msg += '\n ' + lines = ['Coding style parameters:', + ' Progression order: {0}', + ' Number of layers: {1}', + ' Multiple component transformation usage: {2}', + ' Number of resolutions: {3}', + ' Code block height, width: ({4} x {5})', + ' Wavelet transform: {6}'] + msg += '\n '.join(lines) + + msg = msg.format(_progression_order_display[self.SPcod[0]], + self._layers, + mct, + self.SPcod[4] + 1, + int(self._code_block_size[0]), + int(self._code_block_size[1]), + _wavelet_transform_display[self.SPcod[8]]) + + msg += '\n Precinct size: ' + if self._precinct_size is None: + msg += 'default, 2^15 x 2^15' + else: + for pps in self._precinct_size: + msg += '({0}, {1})'.format(pps[0], pps[1]) + + msg += '\n ' + msg += _context_string(self.SPcod[7]) + + return msg + + +class CMEsegment(Segment): + """CME (comment and extention) segment information. + + Attributes + ---------- + id : str + Identifier for the segment. + offset : int + Offset of marker segment in bytes from beginning of file. + length : int + Length of marker segment in bytes. This number does not include the + two bytes constituting the marker. + Rcme : int + Registration value of the marker segment. Zero means general binary + values, otherwise probably a string encoded in latin-1. + Ccme: bytes + Raw bytes representing the comment data. + + References + ---------- + .. [JP2K15444-1i] International Organization for Standardication. ISO/IEC + 15444-1:2004 - Information technology -- JPEG 2000 image coding system: + Core coding system + """ + def __init__(self, **kwargs): + Segment.__init__(self, id='CME') + self.__dict__.update(**kwargs) + + def __str__(self): + msg = Segment.__str__(self) + '\n' + if self.Rcme == 1: + # latin-1 string + msg += ' "{0}"' + msg = msg.format(self.Ccme.decode('latin-1')) + else: + msg += " binary data (Rcme = {0}): {1} bytes" + msg = msg.format(self.Rcme, len(self.Ccme)) + return msg + + +class CRGsegment(Segment): + """CRG (component registration) segment information. + + Attributes + ---------- + id : str + Identifier for the segment. + offset : int + Offset of marker segment in bytes from beginning of file. + length : int + Length of marker segment in bytes. This number does not include the + two bytes constituting the marker. + Xcrg, Ycrg : int + Horizontal, vertical offset for each component + """ + def __init__(self, **kwargs): + Segment.__init__(self, id='CRG') + self.__dict__.update(**kwargs) + + def __str__(self): + msg = Segment.__str__(self) + msg += '\n Vertical, Horizontal offset: ' + for j in range(len(self.Xcrg)): + msg += ' ({0:.2f}, {1:.2f})'.format(self.Ycrg[j]/65535.0, + self.Xcrg[j]/65535.0) + return msg + + +class EOCsegment(Segment): + """EOC segment information. + + Attributes + ---------- + id : str + Identifier for the segment. + offset : int + Offset of marker segment in bytes from beginning of file. + length : int + Length of marker segment in bytes. This number does not include the + two bytes constituting the marker, making the length for this marker + segment to be zero. + + References + ---------- + .. [JP2K15444-1i] International Organization for Standardication. ISO/IEC + 15444-1:2004 - Information technology -- JPEG 2000 image coding system: + Core coding system + """ + def __init__(self, **kwargs): + Segment.__init__(self, id='EOC') + self.__dict__.update(**kwargs) + + +class PODsegment(Segment): + """Progression Order Default/Change (POD) segment information. + + Attributes + ---------- + id : str + Identifier for the segment. + offset : int + Offset of marker segment in bytes from beginning of file. + length : int + Length of marker segment in bytes. This number does not include the + two bytes constituting the marker. + RSpod : tuple + resolution indices for start of a progression + CSpod : tuple + component indices for start of a progression + LYEpod : tuple + layer indices for end of a progression + REpod : tuple + resolution indices for end of a progression + CEpod : tuple + component indices for end of a progression + Ppod : tuple + progression order for each change + + References + ---------- + .. [JP2K15444-1i] International Organization for Standardication. ISO/IEC + 15444-1:2004 - Information technology -- JPEG 2000 image coding system: + Core coding system + """ + def __init__(self, **kwargs): + Segment.__init__(self, id='POD') + self.__dict__.update(**kwargs) + + def __str__(self): + msg = Segment.__str__(self) + for j in range(len(self.RSpod)): + + msg += '\n ' + lines = ['Progression change {0}:', + ' Resolution index start: {1}', + ' Component index start: {2}', + ' Layer index end: {3}', + ' Resolution index end: {4}', + ' Component index end: {5}', + ' Progression order: {6}'] + submsg = '\n '.join(lines) + msg += submsg.format(j, + self.RSpod[j], + self.CSpod[j], + self.LYEpod[j], + self.REpod[j], + self.CEpod[j], + _progression_order_display[self.Ppod[j]]) + + return msg + + +class PLTsegment(Segment): + """PLT segment information. + + Attributes + ---------- + id : str + Identifier for the segment. + offset : int + Offset of marker segment in bytes from beginning of file. + length : int + Length of marker segment in bytes. This number does not include the + two bytes constituting the marker. + Zplt : int + Index of this segment relative to other PLT segments. + Iplt : list + Packet lengths. + + References + ---------- + .. [JP2K15444-1i] International Organization for Standardication. ISO/IEC + 15444-1:2004 - Information technology -- JPEG 2000 image coding system: + Core coding system + """ + def __init__(self, **kwargs): + Segment.__init__(self, id='PLT') + self.__dict__.update(**kwargs) + + def __str__(self): + msg = Segment.__str__(self) + msg += "\n Index: {0}" + msg += "\n Iplt: {1}" + msg = msg.format(self.Zplt, self.Iplt) + + return msg + + +class PPMsegment(Segment): + """PPM segment information. + + Attributes + ---------- + id : str + Identifier for the segment. + offset : int + Offset of marker segment in bytes from beginning of file. + length : int + Length of marker segment in bytes. This number does not include the + two bytes constituting the marker. + Zppm : int + Index of this segment relative to other PPM segments. + data: byte array + Raw data buffer, constitutes both Nppm and Ippm fields. + + References + ---------- + .. [JP2K15444-1i] International Organization for Standardication. ISO/IEC + 15444-1:2004 - Information technology -- JPEG 2000 image coding system: + Core coding system + """ + def __init__(self, **kwargs): + Segment.__init__(self, id='PPM') + self.__dict__.update(**kwargs) + + def __str__(self): + msg = Segment.__str__(self) + msg += '\n Index: {0}' + msg += '\n Data: {1} uninterpreted bytes' + msg = msg.format(self.Zppm, len(self.data)) + return msg + + +class PPTsegment(Segment): + """PPT segment information. + + Attributes + ---------- + id : str + Identifier for the segment. + offset : int + Offset of marker segment in bytes from beginning of file. + length : int + Length of marker segment in bytes. This number does not include the + two bytes constituting the marker. + Zppt : int + Index of this segment relative to other PPT segments + Ippt : list + Uninterpreted packet headers. + + References + ---------- + .. [JP2K15444-1i] International Organization for Standardication. ISO/IEC + 15444-1:2004 - Information technology -- JPEG 2000 image coding system: + Core coding system + """ + def __init__(self, **kwargs): + Segment.__init__(self, id='PPT') + self.__dict__.update(**kwargs) + + def __str__(self): + msg = Segment.__str__(self) + msg += '\n Index: {0}' + msg += '\n Packet headers: {1} uninterpreted bytes' + msg = msg.format(self.Zppt, len(self.Ippt)) + return msg + + +class QCCsegment(Segment): + """QCC segment information. + + Attributes + ---------- + id : str + Identifier for the segment. + offset : int + Offset of marker segment in bytes from beginning of file. + length : int + Length of marker segment in bytes. This number does not include the + two bytes constituting the marker. + Cqcc : int + Index of associated component. + Sqcc : int + Quantization style for this component. + SPqcc : iterable bytes + Quantization value for each sub-band. + + References + ---------- + .. [JP2K15444-1i] International Organization for Standardication. ISO/IEC + 15444-1:2004 - Information technology -- JPEG 2000 image coding system: + Core coding system + """ + def __init__(self, **kwargs): + Segment.__init__(self, id='QCC') + self.__dict__.update(**kwargs) + + def __str__(self): + msg = Segment.__str__(self) + + msg += '\n Associated Component: {0}'.format(self.Cqcc) + msg += self._print_quantization_style(self.Sqcc) + msg += '{0} guard bits'.format(self._guardBits) + + step_size = zip(self._mantissa, self._exponent) + msg += '\n Step size: ' + str(list(step_size)) + return msg + + +class QCDsegment(Segment): + """QCD segment information. + + Attributes + ---------- + id : str + Identifier for the segment. + offset : int + Offset of marker segment in bytes from beginning of file. + length : int + Length of marker segment in bytes. This number does not include the + two bytes constituting the marker. + Sqcd : int + Quantization style for all components. + SPqcd : iterable bytes + Quantization step size values (uninterpreted). + + References + ---------- + .. [JP2K15444-1i] International Organization for Standardication. ISO/IEC + 15444-1:2004 - Information technology -- JPEG 2000 image coding system: + Core coding system + """ + def __init__(self, **kwargs): + Segment.__init__(self, id='QCD') + self.__dict__.update(**kwargs) + + def __str__(self): + msg = Segment.__str__(self) + + msg += self._print_quantization_style(self.Sqcd) + + msg += '{0} guard bits'.format(self._guardBits) + + step_size = zip(self._mantissa, self._exponent) + msg += '\n Step size: ' + str(list(step_size)) + return msg + + +class RGNsegment(Segment): + """RGN segment information. + + Attributes + ---------- + id : str + Identifier for the segment. + offset : int + Offset of marker segment in bytes from beginning of file. + length : int + Length of marker segment in bytes. This number does not include the + two bytes constituting the marker. + Crgn : int + Associated component. + Srgn : int + ROI style. + SPrgn : int + Parameter for ROI style. + + References + ---------- + .. [JP2K15444-1i] International Organization for Standardication. ISO/IEC + 15444-1:2004 - Information technology -- JPEG 2000 image coding system: + Core coding system + """ + def __init__(self, **kwargs): + Segment.__init__(self, id='RGN') + self.__dict__.update(**kwargs) + + def __str__(self): + msg = Segment.__str__(self) + + msg += '\n Associated component: {0}' + msg += '\n ROI style: {1}' + msg += '\n Parameter: {2}' + msg = msg.format(self.Crgn, self.Srgn, self.SPrgn) + + return msg + + +class SIZsegment(Segment): + """Container for SIZ segment information. + + Attributes + ---------- + id : str + Identifier for the segment. + offset : int + Offset of marker segment in bytes from beginning of file. + length : int + Length of marker segment in bytes. This number does not include the + two bytes constituting the marker. + Rsiz : int + Capabilities (profile) of codestream. + Xsiz, Ysiz : int + Width, height of reference grid. + XOsiz, YOsiz : int + Horizontal, vertical offset of reference grid. + XTsiz, YTsiz : int + Width and height of reference tile with respect to the reference grid. + XTOsiz, YTOsiz : int + Horizontal and vertical offsets of tile from origin of reference grid. + Ssiz : iterable bytes + Precision (depth) in bits and sign of each component. + XRsiz, YRsiz : int + Horizontal and vertical sample separations with respect to reference + grid. + + References + ---------- + .. [JP2K15444-1i] International Organization for Standardication. ISO/IEC + 15444-1:2004 - Information technology -- JPEG 2000 image coding system: + Core coding system + """ + def __init__(self, **kwargs): + Segment.__init__(self, id='SIZ') + self.__dict__.update(**kwargs) + + def __str__(self): + msg = Segment.__str__(self) + msg += '\n ' + + lines = ['Profile: {0}', + 'Reference Grid Height, Width: ({1} x {2})', + 'Vertical, Horizontal Reference Grid Offset: ({3} x {4})', + 'Reference Tile Height, Width: ({5} x {6})', + 'Vertical, Horizontal Reference Tile Offset: ({7} x {8})', + 'Bitdepth: {9}', + 'Signed: {10}', + 'Vertical, Horizontal Subsampling: {11}'] + msg += '\n '.join(lines) + msg = msg.format(_capabilities_display[self.Rsiz], + self.Ysiz, self.Xsiz, + self.YOsiz, self.XOsiz, + self.YTsiz, self.XTsiz, + self.YTOsiz, self.XTOsiz, + self._bitdepth, + self._signed, + tuple(zip(self.YRsiz, self.XRsiz))) + + return msg + + +class SOCsegment(Segment): + """SOC segment information. + + Attributes + ---------- + id : str + Identifier for the segment. + offset : int + Offset of marker segment in bytes from beginning of file. + length : int + Length of marker segment in bytes. This number does not include the + two bytes constituting the marker, making the length for this marker + segment to be zero. + + References + ---------- + .. [JP2K15444-1i] International Organization for Standardication. ISO/IEC + 15444-1:2004 - Information technology -- JPEG 2000 image coding system: + Core coding system + """ + def __init__(self, **kwargs): + Segment.__init__(self, id='SOC') + self.__dict__.update(**kwargs) + + +class SODsegment(Segment): + """Container for Start of Data (SOD) segment information. + + Attributes + ---------- + id : str + Identifier for the segment. + offset : int + Offset of marker segment in bytes from beginning of file. + length : int + Length of marker segment in bytes. This number does not include the + two bytes constituting the marker, making the length for this marker + segment to be zero. + + References + ---------- + .. [JP2K15444-1i] International Organization for Standardication. ISO/IEC + 15444-1:2004 - Information technology -- JPEG 2000 image coding system: + Core coding system + """ + def __init__(self, **kwargs): + Segment.__init__(self, id='SOD') + self.__dict__.update(**kwargs) + + +class EPHsegment(Segment): + """Container for End of Packet (EPH) header information. + + Attributes + ---------- + id : str + Identifier for the segment. + offset : int + Offset of marker segment in bytes from beginning of file. + length : int + Length of marker segment in bytes. This number does not include the + two bytes constituting the marker, making the length for this marker + segment to be zero. + + References + ---------- + .. [JP2K15444-1i] International Organization for Standardication. ISO/IEC + 15444-1:2004 - Information technology -- JPEG 2000 image coding system: + Core coding system + """ + def __init__(self, **kwargs): + Segment.__init__(self, id='EPH') + self.__dict__.update(**kwargs) + + +class SOPsegment(Segment): + """Container for Start of Pata (SOP) segment information. + + Attributes + ---------- + id : str + Identifier for the segment. + offset : int + Offset of marker segment in bytes from beginning of file. + length : int + Length of marker segment in bytes. This number does not include the + two bytes constituting the marker. + + References + ---------- + .. [JP2K15444-1i] International Organization for Standardication. ISO/IEC + 15444-1:2004 - Information technology -- JPEG 2000 image coding system: + Core coding system + """ + def __init__(self, **kwargs): + Segment.__init__(self, id='SOP') + self.__dict__.update(**kwargs) + + def __str__(self): + msg = Segment.__str__(self) + msg += '\n Nsop: {0}'.format(self.Nsop) + return msg + + +class SOTsegment(Segment): + """Container for Start of Tile (SOT) segment information. + + Attributes + ---------- + id : str + Identifier for the segment. + offset : int + Offset of marker segment in bytes from beginning of file. + length : int + Length of marker segment in bytes. This number does not include the + two bytes constituting the marker. + Isot : int + Index of this particular tile. + Psot : int + Length, in bytes, from first byte of this SOT marker segment to the + end of the data of that tile part. + TPsot : int + Tile part instance. + TNsot : int + Number of tile-parts of a tile in codestream. + + References + ---------- + .. [JP2K15444-1i] International Organization for Standardication. ISO/IEC + 15444-1:2004 - Information technology -- JPEG 2000 image coding system: + Core coding system + """ + def __init__(self, **kwargs): + Segment.__init__(self, id='SOT') + self.__dict__.update(**kwargs) + + def __str__(self): + msg = Segment.__str__(self) + msg += '\n ' + lines = ['Tile part index: {0}', + 'Tile part length: {1}', + 'Tile part instance: {2}', + 'Number of tile parts: {3}'] + msg += '\n '.join(lines) + msg = msg.format(self.Isot, + self.Psot, + self.TPsot, + self.TNsot) + return msg + + +class TLMsegment(Segment): + """Container for TLM segment information. + + Attributes + ---------- + id : str + Identifier for the segment. + offset : int + Offset of marker segment in bytes from beginning of file. + length : int + Length of marker segment in bytes. This number does not include the + two bytes constituting the marker. + Ztlm : int + index relative to other TML marksers + Ttlm : int + number of the ith tile-part + Ptlm : int + length in bytes from beginning of the SOT marker of the ith + tile-part to the end of the data for that tile part + + References + ---------- + .. [JP2K15444-1i] International Organization for Standardication. ISO/IEC + 15444-1:2004 - Information technology -- JPEG 2000 image coding system: + Core coding system + """ + def __init__(self, **kwargs): + Segment.__init__(self, id='TLM') + self.__dict__.update(**kwargs) + + def __str__(self): + msg = Segment.__str__(self) + msg += '\n ' + lines = ['Index: {0}', + 'Tile number: {1}', + 'Length: {2}'] + msg += '\n '.join(lines) + msg = msg.format(self.Ztlm, + self.Ttlm, + self.Ptlm) + + return msg + + +def _parse_precinct_size(buffer): + """Compute precinct size from SPcod or SPcoc.""" + SPcocd = np.frombuffer(buffer, dtype=np.uint8) + precinct_size = [] + for x in SPcocd: + ep2 = (x & 0xF0) >> 4 + ep1 = x & 0x0F + precinct_size.append((2 ** ep1, 2 ** ep2)) + return precinct_size + + +def _context_string(context): + """Produce a string to represent the code block context""" + msg = 'Code block context:\n ' + lines = ['Selective arithmetic coding bypass: {0}', + 'Reset context probabilities on coding pass boundaries: {1}', + 'Termination on each coding pass: {2}', + 'Vertically stripe causal context: {3}', + 'Predictable termination: {4}', + 'Segmentation symbols: {5}'] + msg += '\n '.join(lines) + msg = msg.format(((context & 0x01) > 0), + ((context & 0x02) > 0), + ((context & 0x04) > 0), + ((context & 0x08) > 0), + ((context & 0x10) > 0), + ((context & 0x20) > 0)) + return msg diff --git a/glymur/core.py b/glymur/core.py new file mode 100644 index 0000000..73a286e --- /dev/null +++ b/glymur/core.py @@ -0,0 +1,123 @@ +# Progression order +LRCP = 0 +RLCP = 1 +RPCL = 2 +PCRL = 3 +CPRL = 4 + +_progression_order_display = { + LRCP: 'LRCP', + RLCP: 'RLCP', + RPCL: 'RPCL', + PCRL: 'PCRL', + CPRL: 'CPRL'} + +progression_order = { + 'LRCP': LRCP, + 'RLCP': RLCP, + 'RPCL': RPCL, + 'PCRL': PCRL, + 'CPRL': CPRL} + +WAVELET_TRANSFORM_9x7_IRREVERSIBLE = 0 +WAVELET_TRANSFORM_5x3_REVERSIBLE = 1 + +_wavelet_transform_display = { + WAVELET_TRANSFORM_9x7_IRREVERSIBLE: '9-7 irreversible', + WAVELET_TRANSFORM_5x3_REVERSIBLE: '5-3 reversible'} + +ENUMERATED_COLORSPACE = 1 +RESTRICTED_ICC_PROFILE = 2 +ANY_ICC_PROFILE = 3 +VENDOR_COLOR_METHOD = 4 + +_method_display = { + ENUMERATED_COLORSPACE: 'enumerated colorspace', + RESTRICTED_ICC_PROFILE: 'restricted ICC profile', + ANY_ICC_PROFILE: 'any ICC profile', + VENDOR_COLOR_METHOD: 'vendor color method'} + +_ = {1: 'accurately represents correct colorspace definition', + 2: 'approximates correct colorspace definition, exceptional quality', + 3: 'approximates correct colorspace definition, reasonable quality', + 4: 'approximates correct colorspace definition, poor quality'} +_approximation_display = _ + +# Registration values for comment markers. +RCME_BINARY = 0 # binary value comments +RCME_ISO_8859_1 = 1 # comments in latin-1 codec + +# enumerated colorspaces +CMYK = 12 +SRGB = 16 +GREYSCALE = 17 +YCC = 18 +E_SRGB = 20 +ROMM_RGB = 21 + +_colorspace_map_display = { + CMYK: 'CMYK', + SRGB: 'sRGB', + GREYSCALE: 'greyscale', + YCC: 'YCC', + E_SRGB: 'e-sRGB', + ROMM_RGB: 'ROMM-RGB'} + +# enumerated color channel types +_COLOR = 0 +_OPACITY = 1 +_PRE_MULTIPLIED_OPACITY = 2 +_UNSPECIFIED = 65535 +_color_type_map_display = { + _COLOR: 'color', + _OPACITY: 'opacity', + _PRE_MULTIPLIED_OPACITY: 'pre-multiplied opacity', + _UNSPECIFIED: 'unspecified'} + +# enumerated color channel associations +_rgb_colorspace = {"R": 1, "G": 2, "B": 3} +_greyscale_colorspace = {"Y": 1} +_ycbcr_colorspace = {"Y": 1, "Cb": 2, "Cr": 3} +_colorspace = {SRGB: _rgb_colorspace, + GREYSCALE: _greyscale_colorspace, + YCC: _ycbcr_colorspace, + E_SRGB: _rgb_colorspace, + ROMM_RGB: _rgb_colorspace} + +# How to display the codestream profile. +_capabilities_display = { + 0: '2', + 1: '0', + 2: '1', + 3: '3'} + +# Reader requirements +RREQ_UNRESTRICTED_JPEG2000_PART_1 = 5 +RREQ_UNRESTRICTED_JPEG2000_PART_2 = 6 +RREQ_CMYK_ENUMERATED_COLORSPACE = 55 +RREQ_CMYK_ENUMERATED_COLORSPACE = 55 +RREQ_E_SRGB_ENUMERATED_COLORSPACE = 60 +RREQ_ROMM_RGB_ENUMERATED_COLORSPACE = 61 +_reader_requirements_display = { + 0: 'File not completely understood', + 1: 'Deprecated', + 2: 'Contains multiple composition layers', + 3: 'Deprecated', + 4: 'JPEG 2000 Part 1 Profile 1 codestream', + RREQ_UNRESTRICTED_JPEG2000_PART_1: + 'Unrestricted JPEG 2000 Part 1 codestream, ITU-T Rec. T.800 ' + + '| ISO/IEC 15444-1', + RREQ_UNRESTRICTED_JPEG2000_PART_2: + 'Unrestricted JPEG 2000 Part 2 codestream', + 7: 'JPEG codestream as defined in ISO/IEC 10918-1', + 8: 'Deprecated', + 9: 'Non-premultiplied opacity channel', + 10: 'Premultiplied opacity channel', + 12: 'Deprecated', + 18: 'Deprecated', + 43: '(Deprecated) compositing layer uses restricted ICC profile', + 44: 'Compositing layer uses Any ICC profile', + 45: 'Deprecated', + RREQ_CMYK_ENUMERATED_COLORSPACE: 'CMYK enumerated colorspace', + RREQ_E_SRGB_ENUMERATED_COLORSPACE: 'e-sRGB enumerated colorspace', + RREQ_ROMM_RGB_ENUMERATED_COLORSPACE: 'ROMM_RGB enumerated colorspace'} diff --git a/glymur/data/nemo.jp2 b/glymur/data/nemo.jp2 new file mode 100644 index 0000000000000000000000000000000000000000..1b97d0dc85cb4722b6b04f2973e03583a0d25048 GIT binary patch literal 1133504 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

U0y`cr_JU*~XC=9ld_F$>ar15b$Ecl=Yw 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�OJn?PSjq9DiIB09~(H9TmDjb_mQ|Id}rq)ehRutRAkpoZmxNPVQ&SNPkUhjv| zQ10?mIZ9g|gNt5?C;R+@ondz1>=3R= z!iAWglIIgw;{g52h+rLvYzp~4SZpK4!$L;Wc!FzrOGzZG0Cu^7B0S$>P7om&;qChg zj7$V9u5UeUkN{?rd_?i?q5gDdIOLxn+yXF?!ISr`S$^n((prhX3OsdVvUQ5S$b#)S z1}veMQ0EG2?4M6v1e9mx#-?VKuuk!fK96EOKK~cAn(s9-E@DeVG@_4CAo>pttx)^u z4x_xTw<}&=F{;I}rCH*| zlpe+#go^Rq+nkVY=NK%)$0kc;J|Z7OdL`*pqH>LV=$6O0BXp3i6(#ExxEcqMxVhzr zmed#Cfs?pGKawm|NqK!BbJf*kRnju^l-$dh)}(^Q3niXhDkrb74GTXn z5s?NI&G>|o#PwL%M&G%)?Z{CbUP|u@ytAUqFO5aSc0m}LmcRbBIY<{}8ATWoMX+FK zS-Qo;sc&(Q3&vRfnNmOjn7+7MMCQk0P5>talY*MX?y$rI`7q4%$hG0<(J3apwY(se z^4iL1Q7G^WiwhkwR#&EVyS_6Cukngc_|9bEGu03IyGMS5cV2Ioe^D z9l=3|I@UMC?_O`I#`uy51F5ex5R1Y|>W$4DX8F<8KS_m3m}A<0vPx;i4AHUM|s~hTYCzKSao(@01YX)u>BrsdDcdNB{9gLtkV};Vy@!wF zWb27Pd&{dU9Y}!(B+!*h3F66J4$SDez!H<;5&=(TQBFql-_5Y9v>N@>S&Y%EA}%2S=&U zsR{9KsHj{27}aDsRXYtK(jWk8_5HI+s2npLBIS>j&?)uRH#TMe7_8!JIR+=;{}AiI zmaXMv)MJywsiiu|#oAC5cF)UYLaNEDg7l*;jSGvSPuALhY7ok{{56T*J{7z~bmRJd zt1xWg!{LyHKsvzmW(DHdGW1Z#t{C}^sNAQ-j+o^Sj9Th3Ow$p_6(jOM8Oy(g0$jq^ zsRanm>NOb}#tV0?N~k*id8V)NWasQxza0X!{c(p5>@vG2>2obe!?6>^`BMa?M)%cE z?jLsa4lfe#A;K|pJ>^6vzl7b*+@w#uO%#L4^hVJ9bT8@nExG);1Xe=3>SJFRBdr)4 z=p`C@0Xy1rE;;}G*SBw!C%PGcEk{8rE2x@weX?J@RK_o&Hs@}gh%zAMAHLFLhUoJq z8YKee2TNRBYk)p=5dr_biZux%vQfWpEtnN2q0zoU68Ax8O16Gr|^pT&-Yx>=TQn) za;{&Ec>sHxD4e5i)mgYKa^GWRjccf&zrs!(Na+J<0OPoB$f|T{xp^^_gqvvOL6EUK zjLv1X-G6mHws`SR<#gX6BAGRhK;oDo=P7?+&8V~1{z(5@ZeL400j*R z0G%=lnzo-sg^1}-Efc`uKhctR2aZpk+s5o#a2~ceYaL{=4124yybG|OClEEYoM3$O z3-Br{c`m|_F2b02Q4o{>gsMY2ftODX{4iR#PC;AtPum2Uf21u%q#%As&2KPIBMBom z_(>ylQ`4d+bP!n?_%gy)rsmuz3e-e1CzEg@hc#1lqzCKq7f{0epqDrxHywVD!~8Dm z%vpQ`W4ySF?=YYlPSh-oOgE*0uXlcU3Q=W89+|C)@CNyEnin0oE;a_;pY}eye&wD& zi7)vKY%=n`51nEV7qiSW_>4hL+5rpA({^hC5-#=R*yqM}68&e1eS1R1=X@o>?U0SP zeg-=Z*bgXV7e4i1DAxM^=`E7}6-bD*NjKjxUhbp}%j4?xnxKdtBXzKbBy_Y{0_JHTQf8JwB&BJ4C@86O0bx5t zwe-goHIjftlixP*DDY|8y*|1s6z#$ysE)Wye>U>X44Nh*#a2q_x{lfX*6PoLGSYA zK)@rV-d&B0HfFHyoMn(qFDFo8TK^+<2B&n8jc_Rx1(?GiOwU5`()>?CW-py*-~j-s zq?wmB4Ssf{=5)TgA(5XoVxyTNIvDjA_Z9gOYwB?%kUW!Nl@t%ZjT`y%3 zhJx~2bop;(#twB3U;Lqdhdy;2SFtO~>lq8ird40C5QFxdxrd+jxH^Se+z6Ve*lD z@?ll18cbTB3u5my7?j@ITrgj2hW%6G~`nKnNQM8BVf)~gZ znqy&BOd9Jx!v?C2|g+F47ZRia`$p+iI6TEd} zkOyo2T*&6auai|915#VxLE5*8UmQtV1VyJefI36x^po6qde`U$$_5CKMNajIBXz&d z`K}|p{vxg7vro~H7>`4eECZ+5$c$BDKH5EnTFc{YEDQ$*Yw-Vox>s-pd6gJ(scv?R zb@p6yu?<%ns0?utzMz03quhK;P9_{ldb+VObc_m54EN+G1uTzLDnYR zchEG-J(6NV)#?XR17G?YOfS-(?_3Cg3$7>zc*cTgjgFPUcBn_`)w|~Yvn+hr2EX`qt&L< zm`NbL&lIg!|BYf74Bn*}s7r7pCAqZ%NV9tYKfGtlQZ~D5|IdnE9?|GNm|j$dTJk@> z!0Q=Ure1dQaik!`=5TS!8wCEo>swAXpzW2B_@;gE1O9I)NY}s95o=NHJz~MEYLb}xb+=e-) z((D3U)dJR;-(X!A{$miQ9FP#VF?lNt@k6gtoKOa1mt#e3!y!&F?>j$aa&;h_=#N$N ziiijbm6cj}f`F7GmsB9>26;0doxN=NmL_gfT|7p?6Y1=vmgYIq5cJR9K7QHI2 zd)p&~PyKo}s7qUhzi@Z}n6ITPE;9`Efm;jQE?Cx{6WM|)kM(mIRCa_Y6tDHX)dMzs zx;+(16jj|(O9GZe8lC};G|zBaJZ`6?<+16NtWjtA?7kl`1|UIVb~LQ?N25dARty(_ zVpHS32z1vb8XFgP6u#F<_~_O=GvgG@t(ZHKh}I&wJ~g_eGE@5Eu_FKeSn_G+3Om>~RI~Vz z5tk@5tI<&SAhhkO-$~v)b#au?to-L9sHTsYiacfePx2QdjS=8{?%ouuohPCb$H00B zAM~H7`ksYXwNBi>hZ*r8QN=Z2akq!nVTy9}B zT;eXt=gFcykUy$A<$q)=&pk+g{QI6m?KMk8sWqYxoS#Y`jbd|Z_%qY7(H}a<+UskF z-~jOwxaknWj_M6`$tI{cNK(Hg>kl~r^KkahCOa0sx>S-WE2j~ki%4oT+bn z9@}18buGVv7ac}1j2mi!1K7oYwqy&9%-g{XDRS_-@o$R&W3gJH)Wys$|I*Us$9%@u zgR*SG;(U;gwgxCx-$|{zeX3ysQuH>-`5{}W82TN3P1JGtyV;Ybco$aIV4WEn9AQg# z%b%V5zN1>ZmXIU~-nchmJ<%9EWQ>#(GUG{VGA}}ZQ-#i)5ze3*n2(NhcSQ<_xTdQ7f%e}qLhmC%R=x`8#ZyuC$0GO#!`UK9PTv4>!Ux)g2IQhJZQ!zU`JK5{BgsqS80Wn$?=PcM8> zsD(`hCq2%p;PM0{1f@)5NGqwT+FiW-r+T(YfY=eA#BmF8-L__$PwQ6$VdDefeb19E zYi98yXZc%wSHCmvgRa5JdE!%qr@Ys;xF3X_iFg_=DvvsA`0hVB$xqGpQ=O0I9wKG* ziRtN!^s7sFI?ij0Sr5uXO&>|JgDVjeG5TL-K+|)Y0gfq7C(wmPN%wL!-Oq}Z9Yr5- ztC~5|2}M}^I5k@cmq}7sl2+ZW#;Yn|1Q>+2&X*0UzwYnF#^aYWOHqMP+k=|{gNsq< z<{JSaf{($V)ZWixg{@@&BvUS2z!?HgJ+tZi$fmdp^k|-@+|+>twok=xhA#(|T%+v1 zWSBoRPJ&Wbmr#h%u=NKx$gHluAm+sUsmu5kz3EX~yY_N3#0{fQX|s!Xeo!JzE^m8$ zqf#@D{;@3-cMrD3^r-Z#1bhui-VF%t>X^VX1+ck@b?}=JdU1!EoZu8^giVo@m#sW! z-i?byX*tmE9q++nx$EN#g~tQ-I))@4Yz`m{#-!NM5}Cht_+wHQcseHsu)bJ1Cvj{y z))!&~I$q-BkS0p+k8juK~!QVJy!ywzyf+BLl?hl0=SwjMBOcqhzuSahV>@VEw zVi|djUI4yBKou``b1wyf@}lyn;OW(q^l7&&OnD3ktFhT4t<~a~UHe1KRGPFma~vPX zz$wLV_rr$09nj5<|NCA9gqBaEC3zOLp8<{elM?OlOM*@QnTRv}kNzY@*o;Wr(Bfni z0P(f%D+g^u!D)DKI*bYAG-tX#f<8i-^QU|}n?#cSkn`u|rW?Uorc&Gzzw1Uss>f`X zWPt+;=9lDqF4sU*s|?BxHi7qf%n!$9(klZQCW6ntFgS}3x!NDNKfQ5u0RKY^50)JV zbk1o9iwVxWVSFVKJ|sK=`Y8lVWJKhAxicD>+vK{}!Q?~M0fS0L&1}vJ&hq0S3YdEQ z&uGD(?WQ!cn#YRGfLn}ihgSs80CqZ(iAqrYA1tY|70ixgd?R>w{$&lmJxK2XQ#I7w zBQjc;6heuKmx6?QNpD~I4wVu?&>HbAtaEtl&MraCqh;)`}b`>Z3Xxw*!w7mCp)|4JqP3SJj%kJ`^)7Z7%q2m6cm8n`qZ<_PT>8b(-)Xtl7zSivuo{G*;So}LKfqq!f)@z`7QOE88BjuOfQ z@ddu>5HYCopX(gniB~?>7>pC_LA?UM=0%EW{;r10EZD7z9cdlG(c~e;yf<$F9%x7u zVeqNxVFq55%eF`oUDD=cha{F2oYiHBF?^{5WK>LPpDLJ|y1ENi%YE@3^yig@s^vE` zkR)8Rb22xW(X;ESzi z-r`lusaCAvt(gekT-zqo0vNhWq@RW6&1P8F=NrYPw8oh$GSJ7qQ`UA5l+>0kp70Ne zVL0lR+heZ3Vi!$sUbUp+oy`0901T|5`VV460h^g}-MnqHRbDP~@G5Tk!qL13 z^7PV~g4)&G-jM?Z$0fnkW+E+eCaq<+BQdN`~%%??WLrnYA=82xytiQ2;;X7Tq&Mh%cI>X?d zJ=srm4SrQU4f>Ih^{uE0P}${>PH7c@{_+YZ$L89f+1AZyltV_AXLP!ZWt05+Cos`U$hdKM&g5Vu;!UCyJ1wP%>oMNZ?o{&Nrp&lBzNJ$;xI*F69avEj<*aVJf_u)!1K~ zb;wn<#Nfm;<+eKFuXGVv-s8TC*$^A9?Vz;`zP*Y?n92j25Nn+32MNw6NFERmT&8Z7w<_<&uwXClV7G(0G`f3 zaPLH^Kz&*$@mLc6v=}9avR%{7cPsR`iPe!g5FWTD?bPp{h3s+pUSRzYu%0Ob>j1ZMPDEjC4u7)KUA)YoK_d@0=mahUy%J zJ0{ZhAZJ%&a>G9MT%iR&HxGI^T2gmsaLkA0%UUBPdnCXCvGQEBS>=$oCl_a}Rz z!%yqhaa?-}mC~VJ)nb2;0g7HuId~NLAK$3$AvN-GfT-DG@`Ye+6FBDkdghK2Wyl~& z;EiX9M)#=vt=gVeocXn>7ysKi9Xd9$Td0x#VvO4Q~oj^*>vGX$5sPj|pl zs5CVd4VcUm=r%AEP*drQQxIf3Y|?V%cHdE`E>ZHFotvc_F9`Q#qGX*2o&UkKNIp&;QW z&hR2p(FN1Tuay|+V;_vzImy`gk$ecL&{~8Z4t>U|q?E5gre!(Ra@-`o8y4~0Sd%oU zG6wy3;trktLC_MF!ktf5g$`^U0Pee7-Z}OyXtkUxvjvXxGdnn)76aP4Bjqw6iHPH) zr!#xvDSG{7*7#p+ixspN*dI*H2`wbD($-tYRQ=|@foWdtBLES@H7thC_N=Y->Ujs=ulEjTq{J&w)nhqEIv-oKXcTeU(KSE3Y< zLYyo-psWUJSj5iYnZ4Y%L=Nu6eAUHhf^R1&(q23WpSafTTW}eaFa2vV{1$N_U~^`? zUYi!}Z*-8fJhlEpWvsg@jCunQ`ZA8$eW1*wr3Mq0u=3)@0J!vcI_(;QoTf}=l4y^{ zF(=JA`nq@|2FEs0fwzG+ZWl~u3#Xtug9x-OuE{9(tM1g2IN*!nkLs91Y0}slP)||+ zBEr~*uqYXSfNEAgeu+!EaSW=&cSw5Z<#dKNxj6txHFoZ{djVPQ)4k6;`>D3S!9 z|JX^EyD}e?@RAdGnOgYS7xG#Xrx(<8TM(xEGqytxKrWAdq(L}Z3k3;sy&WpLe&rsj za-7ou#vz(U!MAImWLuJ#{uh}LOPt+?D@?p0gH;I*R^jc*%<)P$o8uaumtY2uI?{|` zzljFQ9?BxST@0z@Pk+iJBHX>2D;RhJoTI&75%ooH7eva_$AnDLA5BbO2trQLd zUpEfNGVcTS{`*KjfZ5(hT6VLO0epKWC_$ zld&eAt``+q5wMT&r|<+50)m`fl0?YG>tl`#g}s#Cr2OomBWHP#BdPx8 zv^tnaq83W^^WUvLN=|UBLt|`kaV^^a*ls_@M1^m99St4ZAt~z=Y*}DqhDOJ2DS;;U z?;~1yLNrjtEU=S>^l#`s>sMx#rUKeNGHb)czbF@j=^^Xjzgn+T=n9Y?Ev%jl7_~7- znxwrxp@ku;@3KPNs1D8jLn0Q^%8_1}$4jc?mR6u9dXgRM(Kh{suu zbE#(O1AOR({5n-*WS#eVMQ$l|@%#0^C2;`?VFSm-Fem$UpN@*oV#_%@(zex3V+_6y zi9JlnN?y6Z(l<#=iwhJmM6M5v(B;2|i2d9s&aQK0hqo!ZpyR6)%cYr?_^x}gurKf# z^m^~VJUyud-|Q~l$KP#5QCl0G0wvonTL4pD&m*CvspX*Xvqk+ z*oYA+9g{LHLPqf&Rysd>eKA$(y7Q|wES02_Ck>|m6|QXvc!5F=As2LxvZP>CF3W6% zz0MlR=@VaBdM&Q%&ERGnyZ|j~+Qm-d;D z6Uy=fpBxE=VMtEObw_~FqIi3)3aa5PX5X3^J+G{tf~qw9m9U^=XFh(L-Xr{3jmyFX z`G^HL?RO!L+pT0IYL&22FWz!&erYpL%)!L#iAv!Yk}5%)O6p;C=x>%~LPHY&my>%- zmV9Ua^K`S$(*53~iE3{wbZ9Kg%q~6hWV_^h{)ncj3T7v~a9B>A)L(UgWz9Zbq0F0K zzx#c20_jfWab2@LmXK$AT4uW=k~T~S+kU{rxCr7x;H{5lyjr=2T}k}RB)*r8FbwJLh#tr5p?3<=xcY}-^iG+}3R*T* zO$w>dg74Dsb6vU;EY9o#9ZbX#<0Y<2r5C|#Vc0aTq-3>WBEh-*U$rZ#Mj6-Qm!38y zYRfrMOCZl7DcXRK)(GPM)Z~(**9Kh1x!|aI^4iKe4ve~MWa7<<#Fm$5;pt#ks;N0D zGQY$Glv*30hv&^ypLSp8NL~?;)D%Y!T-)!boRwh$O=yc)kYZ7w?((!N$bqI(+RX4* z5y_f;t&n=B`OuNp#i^-X0I?2*4+2vWhh3~_oF+Cf3Vi-*iRfprodx(@L#B)TJIXKvT)9LXiY3V%?HJj;ay|A9;e z6Z<`T@XY`;ug?p{Ll)?zoFmdm_!ioyg!FHwZD?F9s$3Ic|IUM4K*-#_puN>(P7i1!iHi`hFQTP~uzN;Vu zEu+#s!hH1v^+Whf_0s^4{(*T1lOEhP6ans*mwZ1wWhB^eWwd2}v-JUtAJI3(T)+{o zNtGzud$yVWS?64_1!JZhWU&-1q4O8d6j_wI{*Uy z_X7Bz_}}UO@9-}k015yQ0FXHW0Ps&401^-Y6a?hIR2KjRP(VOJLgD}3|5E_;e+q#9 z--4vM#x?ZEDFz*zNg#ve*il*6NMGqc`JjsNjK~Bt64q>(uvbE0?sej&@rQ06deHlM zeA>3a(xpH7p>ef<8=Pd52a%C&K?lk%z+su2Aw&i*iPzq)hEfGlk-xA$;EC7kNaMNg zdZb?Y8ZCqzZb0=HfKzDSz^IQwTLJ@c7=NU*xpLz&)f~LVmETfdAj=2Q4ry1TcOfTv z={S5orKQJ1Td@HtLGsFRtzsv8I1Orkp#Y9&0Nus?Z{7Z0RdxYn-M9cG;AjVt6lZ9O=MVuJSS`dgwcV0G!sAPxY~m$I=UjHKybjo6*A9mLfGZ<#x|^m zF4hsg=onB5)ssPx%s_H$Mr(ZQ_rkRO!zIu&o7y%OwYp^A9+(F3F*6Zvs2nShxfb# zQ)=9(oLd5LxdU2msKTnu#W1Uj3-z5A@=C|N{}J9_@LH-~Cccvdcg=7*+b*TRiD*As znbFWC{}FeBUtLpAvguXz_YaC)O-W*p|% zM{XccLGfrvyo|a-{}Q)T1F+biBOU=}+uj^mde6(7A~-QrfP|?TqPK6P@1N_qtMeQ= zW?Sm(nB{MeX?wZIR1Pd1x!Z4WR9K9~=|GrEGu#deIPu)uw`$-Ba3XP6~VD30KUUs@sG z;DYOxnYUhkodW{PkkSN~Jkq~La3;o_(qKSb@E~czUg7aE>XI zs5xNVc%eZl-ELXcRLBwxc8!C`f(_5_FffJIez5N5X=2#g(E&Oe0nw)w!lC#FyasXX ztyS41@I-SF>p19?zOz>~?y4hw0nhe^4DUt9jfp_BnT?8Qt#<67Chhc{qiJ2l$3bJU z2uwzXe=(XVJkRvR!@cvxDxu+3=eq{r+&3N_E9zE{RVQj#E49X)378`w)CJBPv}S&| zZWqqsZHb5LL2zk=Ql;Pje#gMay$n89B7h`t=(~>Rot4N6&$*6|F6BvtmGgTC_Z=`# ziF~duJ8*F5*3-8=B=fpI2WS-v7{K_Sk!2B880LeeX6I94{A{3Z1w3QvgKC~609kj5 zUDp>Rlv2V*x9~^k6n#v2n^0gsc#Zq%5CpW)6r&&F#fD+A;95pKemNMr48ekiQN$@q zXF7|PKiJt)_+U7$Qt6*0io?rQY$|PSMa6sEsE2GBSf34?Kd#q++PF*G6*v$JkAM|t z$ppW5gIAFRK4X%VE=>A{22LA)IR%qKlkjiSpQvC<&%WHIE0|zz(Q{uR1{jo&5s{lR z%~hgdiZjS~55k#jQMpDN31@iD`D=+*c8w6zwvDL|bLMKTH~v3E1~QHe2gcG49b92e$0HKYe@~&j#8{E6YO3$AZiGHQG{5-v4UcAVa#6%ljaUN6 z`+fhl#DR|&9Qbs}09_R`w`m(Eh9bsDoFl{zB`_(80-u4_gZfcy(Jx}g^&^&6&cTWH zj@owXmoK%EMX3ht=fGa2p2kL$>MYwzc%nZHbkPFP{j`2A&ya|{-Z7rZbWY3R1)rOa z%$014SnJP5PcHcIdivmB|6crUu^A!vdmT?mV*43gbS^ll8}%JI6H&XlC}=U-3(4sw zE4OB4bDg7dq#KU9mQPNk#tR5KF?hScePRevNoID5kx=nHTf`nP=!j*m?}MO0h(*H` zghm;pi^pAW3ql3SWDGMO)>kmNuATvU?BUWM?1JNgXDIL#!R@0L4CL8k47dyHx`f@K z>$R3>+ONNy?O@{ZNNC%gwfZ6Xk_64-)AXTNtg){E76q)?p?n+GZX{% z)g=K#$6(UM4Aj~6rh?ebZ*bx_g@6w)Cje?%IyLpopL&}}dY1R;AE-f8K}h(3#6{X# z3;hMjrTW;$x{hy-ll)XuJo+*GWKRQ)J_M@>8$817zt2f;J+trJHJckO#*aQzWF?e> z?&fy)&w_^E)>g0VjmNF&&;j6ch*C=-i3wofv1z(Vl&Cw*b33g`g!)N!-jZ}2@RNK)BFvke z>aM;w)xJc4kUgI^O0!*mcAj`bk^(1m0tNlKmc$ioN-m8jnq=_j2QBv9ZXCy-hqQVE3t2emjr%ncErd_zxfy9ZQGGz^q(EvRdDl z>t)>dM+F47-72feKW%XduJT27&8w$h3P+%4{)IOBR%kD3wa_IRe2`oA5Y+mfficr0 zXTw9ptcS%Ka-7J*3p~T-J2kZ}YlDSi1Gyz(Q9QxWZrcIYKTN0zOI2@(dkUSX?|}W_ z8p!~_O!ijgZ*%?Pyu#7b1oddZgi?>ZN^%+?#^Zqb9t|DE|D=&jW9g|WmM0;JJbyZN8c>&Qr^TL4W00(xu8Vfz_QlKVLB3F&fy*XKV;{lr2wJ- zp$KY%ocSfh(o&4G`^pX=*<8DicEEIsm|lyeYKtE3uI*unwzSa8hw68vz$9yJMxg4Q8-E@#~bk!uzD~>!tK6=yLz58cZNQROd+HZHCAUPFk2p6 z%A}<^tK9%p`;fDKf#FoY%)I_F4A^O%6EjWiw2*K8LBBy)ZQ?t_n|4c78|1(D{6Slt zP0TXi{lJ^$+3@Q0$PM_tA?Ng1;b3%CsARTsyi&hv3fXTd1ek1Eus{PV*GH+Lg%QpZ_U z$d7HB__xCt!%uwJ?dK(Ih61+~t+9zSW86#{Tp8YbC*op-{Ksv#%;>nZyhxnp^KZ10 z9z;oq9DlyI7;VST zb?NP(LZJ}{LW{Q-0sr&Nqs~;sFLN=jo$7MS%W<=8v;k6hlWw@nCi0@NpqqO7!DW%my}CIM4YbDQykec&WFFy4?MW zdfl+WVE?xf-{gt~L)^x{k9aP-7rq-D4!Pou@X~(Migb)QavIFvH?3l(MY?xA)W0(lMf0+DO zb_}F4az!u4G#^-Nc9s+&8-|2upMW5Uu>A9|hnbbj2a-@gJB2hl_V)_-=WZEA84nVh zOz@&P6{yb3>q?gu2fT1#LO2THcMko>@V@{!K*zs{5rP>&0!6a`fvUzC5yUVbo|sC0 zfTbDv2+@9Q9lS$YVTgVBKVC7Q8+ePbs9kqF zJTomqwLjG>S&oIO{F;W1(ME0=Rm8gn!m{jxQC&)$xn*kSl02l2An6YINgAi4yZ>8- zI9?XCWGFJm2(-q3MbY^|ZebHUWLJSWhI-+NhD&=pjXHmb=(+@MWg4%+!0L#_Ng8mk0=Bw^fv~*p3R@u z{q$3pAqAiP=l$-T88Gkg&6GF~z=>d5!7Nw>PMYL+FAeqoZuL*ssbdcu$~-1lKygmf zrquuATa-%cB8ra~B()4#mLic%#bzSlRa2C^jtKP3dj*J1E2Y zdo$}Pw}LyP7fLFO`Eq5gt?f%c0+Pcmb1NKFL1$5<_DQHW9Z1z641`HnuzVjb;R0~L zUfVAqNiCGwl_MW=^pIUAA^_4`NB}j_zd$J^?xVkclqF2&!rz$sv9+j8Spw@4Qbg)U zHtkK-@}Kf(AO9*}$Uy-2EAnpyC=fESZP7Kmo{gzGD${{GmG1&EQ0t9$4<6%up1SsC z=DBFojkGa!;`_KZd#F_65jXPOlu9FQDp|QI!8GtBNFDz`%qLW~SO68OM}Drb=9=Tj z8;+%dUhoK`b84)!Q&KNQSu7(8Fq?Mp%edBsh+}k)@Ju+tgu9-0nMyPWLQ!h$fm~XG zniZ2oxr~CF*ROWxiOc##tqAWr@0EgjajQ(qg7ZEnG#<39p$ygEA-RhR?hf^*kvCn# z|6d6pP2x$a3t&;Y0D;wv%DO#cKc&Lp(2F^Z!1(12OT<4&Nm2( zHY`%R(Ek^Xl}wEQB1_DDXbktFQuv$?Nr5OL-~!+p*{64jaNG|mWVluHX$%Qa(cJZd zJ085R_MGSIYFZ0fcEPN$ncJXx1*E?$2xQ%kg^Igxb{+$+^n$r_jn;|k_S7Fk6$8S$ zBr@+%al-N`GYKf*HKd5cT+Y!}cUHLXw6>S!-zyLv8^D>kPUQq2hhh{_Y(2HpXy7Ra zkF<4EWghHEbUJc>P)-TO6i+kAeo_^*j3)MQvB=BCz3pv5xJo-#kl@IwSos$r44-B| zkS%U@K*LMseR(9f9MIDOL?UrUf1(OLQQ>&fw$?>8kFgueHf+jFSc=InnT- zKm<3lnS%d+lb>e(Br!wDQ$aR=P2yiR779> z*Q>={C0SWt(x0ImdH0K=0?soA!V6+hgoU^ZKJ+tA4i!%la7rpQ%~y!Kgsl@cMx6)7 zDM1!zIe#Z_AhKuh(z*r_gPhkqj+F7vF)*ott!)O-rT*zR)JMtCmd_O7e>(e~ITGVjIG|`p!0hwAW zW=i2>zZ^hyezN}kosM5!s{#sW?rcZVf3ypAn^#mWEl0ucl7|8qQWb@S>XCYGoxOZ* zZWH`@7*v%~Js0;GC4Be1Ik%1BTjWnAY4JT@T$}$6!_|GEJEoFH6+`N|N)$)`R2N){ z_N0vUigN`lnE<-MnphC7`DqQ}Tjn@TO5o!Vw7$$S**sC9Lyaufaa2R%u}@Q1_xkwC z)fRr=%UX5FpYVRc;j)5z?s>Cgo1FWZXIdpI9>=rz%zqpsnZkj4L04wa6(6HSli?!>WBRy^=*T zEp#)GfP8*^0L&kA`6Qn$Ytw1B6l+@3b21)0xb!PQqQUfcv@CAze}L#9GKsVtk#f>o zMN-nC!K3$P&Bk22kks6Zw8%;WIeL6v{LQ6*3EA)?>STsS&kuhnHn83K8yeG=Y@|M} z*}~x{TVR+Z+FZ34=B-thb50@LtspST^i+27#m{YpB73w_EH`0g*PUOvleL@06GU9k z!a>3wh)&`MbQ?$QNJw6MC*e`en9Fk)0Iu+$O9BvVkw!j!lNHeuVe~x#ymaO~?bIP0e5Id;U=uxqU*h z@CjRHN|6X?pB2yaw23VntVOP9RZR{!VtJcIS8*S-{jpot{|*N4LNV4O6WO^D2$!`N z?bY?3VwEn3rPs1bYh%Q|EF*#vP;`X$yM7T*XK@vZ%j2H$G?R+5)IJqx?noUA=lj~x z`}iGXeZFp8j1@uv=Vl+(<~K0KE(L5oK^Py4h%~aZa4d!qAh7byrz6kgTb-bKS#De2 z{GhLp6Ce>nk9|3Cf}0hubC{?t#I;|-VAkFve=52@hsN}B2Wm7iRLxDcm12BcIQHGX zdfielndk}ZY@pY;%lQvK!Si}XgXZ*+2hHeQhSZuHE-?&e3#|y#gjBHe3-qfHeIY8C z(KK>=P>R__S)F~psF9N_IL=^Ge(=b^ca`)&sAeRfL#SH(Ea#h-W+)rIAAY9qD zr1q=NtyH^(eZG9lZT@A#-SWnT_RHJedzJV{TnNeszMbpVG0NA4T?Fv(+4rD_TwRx4 zZUK*F%pr{SURuc8=vMlZq>E^|Do-<6prf3WQt5*0h@>0oc7l0VRO^-^nMHRNS0--Wk9X}(S|4!s5XOrAybWNi?@pdJ%ZEXFA8BGy(%dSMH z8I3N%u0^Q2$oIU8^+}-@VVQa@)kw^WwB*l<<>7`l9Wt=vYkvoNZc_z%hN(al((^;f zPy1P5`fLK|sNCG2;Y42;gbzSGkw)o>0=oSut0>oEoqw$6`zRNn6BTL{VhW>t+eC3B zf8-2$&YQ8F{rb#hX3esL(E`lXQSi6r1Xz7`ZhF&wPOeXL>#t(y#~`{DQjF{rWJOdO zB7u3MkaxmivIRW7aU^e(w8DBJbA(FdjQ?apb-HOn`1xHQS9-d7vKyht&9ifIDHGR0U~ga1-r#H_lk-+wg_T{ zl?LoNNp^odVgkx9>#@-C=!M7`ykDhwEZ$byg4d%2A-B16KqJQ^t9kjATWh_}-n6jS zDk$tf4f4b1W5Ma^_a$-_X9jmST-i9Tnb$q7c<8utQ&2v&Mn`f$n#a&VDOSk@UfM|s z57`cqc^gG%cQXAdGt?}PWIUVj!m8z4m(Cum<7arX?*hkP#LljD| zSix~OES-7pDPz`>IIuG{g*hT7ej2X|%5sN0Qc(%%9BcN>LV_!Y^rZWB>a-_8&0I@>zNhEtMnlUnbYD!Xg}9z<+CNh zN3LWtR?3jkA@en6$^wsP4$y#th3&VTRhY;2vDS|yjhYS5#E=&#@A=E~p_GuVgx`*31bK5;KNuj_hqRNP79Ok6gwNtvnj}QBM4JyoZMbp{T=5O& zwcC(2FCZ%ts~h4-P6oIf?Lc{T6WGn++%=)kO5vU2t*i|Ms>LUD!#?z+T%;;~;EW4{ zIde+!Jkj$)>Bworyuib;(6PG~RN6{Ahm!ZsOf<0Ll9Y4wtZe2iM<4Sq?M~KuV*8ls zpEWRu{gJJC^*L=--`%{sJ2&pHNRCX}+7q^h$0$*BO>!P#FZZX37S=roU}pR<r#W~QE8!6I%r*f-`rVH#f+I1d+5KaDv`kW-XT$u zRvdzo%G|>9g3B^2-+2?soLLZ*GO-2`0z&iy>_EnCF%={1Q7~b4;7l}HLVw~w7h968 zt-L`lT|;LfF=#`S*f95_G1*)D6@7*2u=LyLC0V+-szsnV_zthzV2%0$@H zsF9H@lQ7e_VCT1DXYPHG&+np{_8R&{=+455xgYd-lChZAhPfZEQYpjL!tCXX#mUO zzkZGB1jU^-)c#YWcHfuQMLz#kGd~Zd5byz=7wEyCje{#Qy2q9*C3*65PMHP_SKk$%2vHXypg&Gq@>$lWSEm^ARh>^y~*}k4ADnLI};+eXdg$+UX14DYFvOv%PAYQFy=FaGr`^+JT%O z>)7*)#*e)hu3C>1 ziyf}1a1kPM=XaD(viLubVa7(1U3n@XoLLBZT6h6OwJUOY0+lait^Q@9`>q0@W6C;? zRflX|n~GoF{cJ;C@|GSM|6=~Wgf+p%MBfqDh<^KEzsRYW!W5kwb?wSu{=uyGj5obr zU{Iln_QO@!&U)xe2}zMY&gaQP^=&J~YlImC{i@_{ya4$QP&DxggJmFe6qxY3vl>e1 zlrHd)!M?yJr9JO4${=Qjww(|U2L^v?7$`NAmM^0iWO=MBKQ5pFI#Ov!8+|=hX z&on12BQ!Ab+*U)X)me*!?Ml>)MCkaH+Ch3Rw)1Xv&}l?Ldz!}5B&&#&yfz3)%+F?Qd%-rWuIfmyu@_4i8tqP5R!OY(f@ zKOLus3K`ZVX6N{SDL94jwP=`!-IuBfZJTCUrtqhGD$5nlRkxH=hIw;)?3<8ouvQe}VWVAmvd&khDg1y)?GT@IG0 zD;!d&Oaz@|Ws*-`fEH3aMQu{;8}TRA>5v}(BXB~}xHAm@OAl56x50|hsM-+WbutnFpXsvsgsr)as@bs=PS3#+)NFEh{3 z4bE3pGQK4v2`sv8LSaGaqzYU>Z-BWX3O2)0oW99S7bTr@ZihZqrPF95reS+{xDXaO zUU~PbwpS>}?~dFxbIA3`OQ>Z%Io*;eJ_KW4sP##;z(gD_VZ92ngOXcRhb`(Dl#%>b z`Md-l1C9Ks>GcMeTex|=5Xv-_w-D9q8`Cm{7tdl`Wz$*37S5YOcje#vnyn%dI~9fN;1yKi>nDL#Rk~v6<7kB28uozC zQ>!^g*~uVS-#dLTw!9CO;myjZKF$l?kAqUlP1T%hMMtQSC)d`;k$$~U76>Tk8h8tI zgSDm})>lL21J%Sm_ZHL5h0R-vppKHjp5wITFNBYxz*EV)Aw_OFHe|Hg23t;K)lw0G z_mlRs&Ml6+3Pg`W27fTJ z`t_2ONMctl=ccDaLyEGm-nvkcJq1_y6~(oGh@;IXho2*~kvNy)BhdmmUjsP%h&>O* z{lzf^T~a}W~5w$oniLcQ~4p)lk+XYsS0-HXK0L@ z7hgolWXR13nLhcOj3$rx=|XXHpKBWaQg|qQ`8l`f$*%=);I|Np@h+dx0=88AW-1Z#?x|9lN&nv~mS%j7_FnRWEsu37o_DC7_6aC=Oo%SRrKah1 zUtE@{2p|L@R)?MisD&=S|3o})>2;@u^B}b8+)Dc5TVbwPL0~KfJeNHx@6PFLNAC8V z-d72sQ-;b)wl^s>P#WLGnoxv2Xnx=??bqs6qk3~laur2LWKk}D%GR=%%fih!Yl~!l zCIoz*QBh511i`dtOad1R5u5>X-$|z*9Gd_I9Yygd^8Pnor8^CVGLOmq<}DBH zv3ZmRw&d|P2BlOMH-UC21EE!gPjeYS$gGlg#hw?X3=zI#tJFJ2rhxNYM_)n zM;&AFBsWO|$YYwAR<)z;m8!DT9T&ra3kvRA7;b+Ao?4kk^Ov}9i^%pOI;h2Yig@)M zt|jr^WmaR$^D5xcEaNFPA!4ubE!8u{Sb^;?PtyrabEQrFlT76_AAfd0^OAC1s=G>r}D#TJ;6iH(uuHtQ=uhjlGN;vpR*`3|i>r62%DlMsIRdNJWMTOIV(r z>4|OcRFkL8AbgCN_e0cS7=A}TM7mF$a{}M%>B0aygkC{L{{f%2kIPQ^PRnOF?H8gS zUb^FyKgfJhB5`GeUQ@3&7ckJU7L+mIMJ#N*def#{+j!03*o4^(q>ERp+NCLL&BUfF zudr7V(cm0TZDp}^IR27DbDC|eDlS!JDv#b|cWpG5f4`uia|l1<+4O?y8I6#K*`7!~ zgJY3nTQDH)USyEZnk3SLaRUOIFy8xEXlY6)hRG51lH5 zT59*JRm!*r#yf(lgYm(VJdO+&TIC=Wm|b^ljOc~&Y|u=BYte?$C>>r0tOg9r;2qZ& z&SBMTYBZXzC7pPJcUs2$ObLPyI&iJ2aqg&azr#C;53gn$o?k7sTL_FCN8!l^du`cAiPfU$O52B0EPwh6TzQHw4#LZk~sj}H1*#ZHh^ z)=hMhCpJ2-HZfjR`HCZ;687O0SI+#xib4Yv@i?JhJ)1u*M|1G;Z*7WWBkJws+;7WM zR_CG|vToX(JN)?aROwYqBG)FTtzsaYtlNZc1YV{$c2bFIcvm=txbV)sBm^d^&$IUZ zK3UM&M@Lsq*;Zy;1It)BYOj|1ns2xZ*mOMbaTdm{Dz2bM-3$8XTut7#ykr@{iIh-j z1XD^Yidipxxh+_DPHIAx4~ZE~s^npscTln1N7-xZqjH94_;X^Nd#_1D$tnT#Egp5W zE#jmL{@nIm${Ye{I*Y-0T>B2uH}+!f@NL-b?22f;cFneHtNrNDgJ zrM!^ib)8K*<@nrJQJ$&6J2bhW!zcV>zz47j3J3&(kL;YMU5l&Za`1SM+D47Q+23bg zEM2JnMhLx^L$=Kl)f%!?5juBoEO9urT32Rdqka@QWs;aik07RzRimPFNIk{7IPV(v z%ow2aINJTNd}LQg)7^0SEOhi|Rk^QjkOkCMP-w;N<~Re(@?Y1?0b)Dp`M>A!(wRK; z(ec+g&xJ@X^9 zPW~9FVK-Gy7Z)^W=EhM7((WQsuXuc}e&~|{d;19V0!(PaGgWeT~wr2i{0K+BO?Ot{-hoZN&FdXJjeAh;m{pY4T|wdnvQx=S!}B% zk*ZEMz%mH&BLsDpUj7Iw45WUasSaH3@w>JcSV@foKtU>|f!f2n4kMZtwW&cMhy7sW z-ybcw{}oWBlq8}+@ULf&osoi9BWsZkyjt|vt%rpMRMo!d0GGs?KaQ%uS5EAq(a8QE z?@lRKLwfED^VdKlce9;nBr+AF8@AJ4m-5o!sOd)?gO{(#J&k-)XQrT}1tFStl@DnR zneC@oGq4aQP28ZDxS#?A6c)gMR={uR?ayfLEk5hAD4L!mI&8oAapCl6lZ=U<`U-SK z;s|Y51#lzMPT{xW;7sJqc$*kGL6(Znxnmv;um5Ekcd$5y?D`L$XIPJj_}aK@-OglU&gfW^6(6rrN8lVeV84!|K?x$v$RFM7-bBmVnhCUX?yKS~kzKeIm0fwz=O z;!OImvTG2)HB2@&vAoeDJdaL(qPmiwUw>dvc1*QA5^%DS>&vt=UGm6VNgnV?Vk)N+ zULCk^cHH1dWha=4O*3$Q(?`jJda|%RU1DjWfj;kx`GZbfjQzOyAAbEDyTGFu`*{k8 z1`~Ngama@ZE%Rn4tWKu+)bdVJiD%1$yOMI)CyWrf>3wrJk#?My=3HhtD+hN4K_(HD z)BvU|y;j>gIyf{JXE$XhLNoC8DOf}N$M%?n`7|^?At(5->~Y6TW&O9Ml3`DXMxC&G zArjP5sLH47Q~`zZ0#g+V5Y%JYYXIE??n1y$PIWB0Xep0?2r`f)^O~^9-_DRN;JLdq zAZ@#nQHM&gYc4`In@^av8KVemZ3~sK3G4v_VFmT8sHImm-{0g=&Q9 zt~2r1quZ?a^EQo3QD&#N=5ZDu_$Bq~1>I8?-u7)9w*O9~E#jxZMI<^-Uc3P^Oe#3i zw&Y>?wW^HEe?HLsgC;YlUS5EOwiMJQn}-11fh?^ezx~Rw%*?SpPjGQrk`Em4^rTi_->dI@~#^*a2^KNjHR4vFrPtN@(x^zS7;mr-ZglC%+ z2c6|4$$u^N(Yt2Z;n~frxPrdYf8$=vE<4dicY{Swni;M{Em}e&5nVt z^KdhN$B0oTS;+r`gjKq>!7tmB+JMXW(i zzAVh~lg>4h5)(X8W_^K9x|rL0Y>lLBQlOHy6R_+>WZZB5U@+ewWO4X6+9{7vQT0>O zVYmi+aX(FlfG|^*w@(MT+Y*UU3TlWhpXAm?(HX}WF5(1ICWDnM9*y=Uww5HjqrPhN zjVrliietyy38n>Fn35LN$eau$1xoNtb4oE+i*gk5Q?dBWY5D8Z!I_y zg5~J7yV5OusPkai3#AN2OSn~d$yhlnZQks7C__Pkuq72%O?a`KbMM&`*E@PfS6eS| z@%9X$^-IT!*e#M&FKo`?olY=;j3zGD5P5x66DEQq9QZZxSAdS+eS+r#Y2^eaK(YIc zx>{j*U<))JZ@28StThZCD~trEtc#i}QyK#wZjjkfocEbv+>E>*Ot}Os*noU4o11M1 zIl3jbElTW16>sh(;-g!_08BscQ6QPAzF8_`FR+Qp@msEW>!{0$_A#j1$i*>( z=W~G!bEBK)U;bOMas%DY)SLMwz(OTF3{J${mFFXL@#4t-3&2?Ln?6OV-`}Uve4Wsb zXktI>0B5lj>B5%?;Zb!>AwGG03Lc~~Ro4W87{rGO+Kq#X&~a{6af1+BT|2HU(sJ*H z%%6}L1^q5jwv@X{Z6i^lgu2UlcawWk)Qc7j&*zKqq5>Aeiu^W?Nl=>@|5|>o^P-yn zTY(yVf_34^*Q%RDhtebE#E^>3ji`~RIW8_)#BL2t^1w`rutuQqUN%xC6$eJd9@M@d5<@dvn1m&!oLmhg;Qq`9@`kY@Nlr zzXH=JlOHV|B_ID{aNUHNUFIEh`YSAp_|SW_m5=N#U$oh*QUyC{K+Cr3qdtc`pDp07 z2I%cZN0&qP!Uz1g7g9UH9+knm=VmQ{a(7tsPu%a4rgbyNiWUBwx@)QxG>9LpSRKb& zH0{G=RLs!{ZA>{j+wjlp7IR9eR4Dfm)ZfU|9;WWu5?TXM!ZE-<-9$o*&!lItgrrgT zQZL=$nPv}t@(XzQai>G8StK;{pbzBFtYEW75{XF^&vl?aAme;gg*5uqG!MP;9>`yL z!n86z21Z+Czs1C=Le9sbTR6(*Nu0kOp4ocWKfMfF3RY8B>e&fT*HuB8GHJ79Rn8@9 zRC>=Q7-upBi$!R`?_i!A9q!s8qO?gcUSY!cClTORUEpvP%wK)=4Tu8DPaw=N0fq3!beqK6rDUZlBw6x_4P|imrV*zPn(mEb@xsiEe1E5zSZ*Ocs0=drQF3R7A z46mqLvl<_q=e6veU#rV4hfrhTyKx2Ls^XD?1}|Rx;m%sD%hp29(rY|QO=Y1$`k$VP zgd}TwI5NhR4lIqK84Wwz7YK}RkDj+JB4`_&a1cO~Fk1DZb%AG{j5XOLJHOPbjazY7 zHa6x=QJ_sCiDR4^C8|C#&Sdw@FIzjK$;KU(VWP9wur}S&(BsW@8gGUIit2;sX&suzhXcvc=4O_Ek*orZJ@7liSBO z<@_)Uy^&ylR4jjyy*5X$V|8Hb@~JMV`-+L@ixYfA_$NIzImYX=r?Fyth9y?0`j9I`=4?5f?klW%(MBFWyV|xaR!ILf=_!}Z4(_6P zr_2>A@c_|gTi!o2lNZLI>Y<|!G~k$%)(epw0aS_tWjs|w+D7SuqF&|UAlL5Omn4Tp z(sGu}6jrAZcSvXTxbhvAft5@4CWM$r3KD7&K>`fuV=ot!V(j6aA)#gQc0VX?Gl@Or z=MQ|SQn_eX0V9QRX@;K9eD<(%w#n)%dmX=E2th^z z2x1IsGJE0>yac~L_E8UV-d|?YewinBF*Czu&`4|;0@|gg5ZhtCxKEfPSx11g^jJ*_ zxuf@2dDWl118j)|cGFr?%2tLXW%5Zz+E_L(F>0^wymqtP#=9rTQe9WaDwT+nkMr$by zYa`Jgh~zJw^fj#OV!qygK%D|=$ieh`8x6GjM1yg%2wJT?XR&B>gqzMf1_VK-nMiTP zTi6Lu%oNBm z#1aQsgoqnnZ4G?|{nHUAEB1aN;deILb>{}R>z~7|pT!|yI~n8t4|~Xv%)>@mI5t}U z8ID%W(&@urFUELZu%6F8$Z0ambh-wa__MZB4S81^7sL*eS*3a#f6$ibaV2mxp@8%9 z2eFjDe9hv3d!lc0AMypdewf~AoksXOrb-Ms{^Y}FM=tr5kQJY=T7=nCQ+0A6b%Jxk zXu>#Sa%tP^d92`E4hN>*1LoD`m&kY~l;%QB{Yb0~$$4b!*6fOlxXVsKVpPwh3h>n& zKu2MLud{Sxh^~yAGCw-$ByYXs-2J;~DfKV{B-@l>7Y!(9%{up9rgv0A#`{0kiw^Mf ztaW((E%oQym)V{)+VTr@a^jA2n+PuCwYY4-=a^&YP-$(D11j9usl6)w(Y-XuTPiym z5W_#1x-VBeQlnC-h^}_Nl9SUdADxK@7p321+F&xhEMjxd(XZ*OHHH3f@JG1B!FC8o+>FVcvBi zqpIo^p2SYr$ryOjZ%rN~`ai;0jNe~|N+9jDehbh4Tdq!_no*|V5KG3kl6avneV4Xn zcsWGt{RP&SMoG+qUM66SI4o}LH}P@3Tfx1=O*s3u+xJDaaS7_r3=MDc=v#g@F5wTJ zQ^_I3SC{VW)kyg}^7Jwnk#acUkyxKINR&nOIp>@ZR`L^#`Dv9N`o6xoP1BpPy?>gH zb~P<1!Sa1MV0=HOtPh9ZKqX$!le`V2juJoXPFD=d@>O3ZHM4)Ebwsy2T|zG+jOC+( z0!u5Z{PX_9-~j%40J=rv!d_j>`LGQm$cZD5s#P+CIj(8Fz{Elne^`8UC+3ZZW`fC# zVAb0V%UkCdFS=#pnn)N1)%LgD5p>_pzHNvuL@Yrk;w+y>NO(6HI1T_4vRd|FoL?HR z?&%(So*hMxqaM{*|8CIam_HEg$l)92zAvb}4$69TnF!deCe{%03=e8!r+M})v{lSh zz@;~1lWDi1kVprA^Y5f|fcE2Tw)GIJzh7Hz+%xNJzzTcob*GGLct`m;k$kC#%bU4& z#W#*3XG2}UHLSQT6mnP*WxBtI+8kcs zMl+Q2&4Qio(#J7O$kh6o15U3daii=8Bcq(WzA5Q#HbDx7M(Nh^eW{sLWUN>tIcx*3 z;cOLYgfdTi+_s%|yfu_FRW4^gOp)SFZqGRs$=8m`ZWX9Z&2Wh43wplLt;at19y3kO zrPSN^=4UBuQ9JyAqFij>h~ct`1a`lLG9SIQ{(li84myL1!Nr~+A0d~XP}t6So9S%H z{})$sNGa7}CmMN@8G^mn_Ug@2WPlhm`fDOs{}`HL-b?z9T0EuC`v$k@U@fpxPk1 z2#1(%^jeFyTAR2-nyjnn&#<4gNM>%x|63ueg$pin$0)-kZn@0j3RK~C^t-EfeOcvf z-)~rSt-xO{9jh7UFuHqCbv75uV3-3b?#b?1xQo7q?#Pgdju(I%dVp_R7{fvdZU1oF zNORwm@yW4h+PM6;wH@3Ec{emgH#hzM&Rlhd43j%lH0$UsdGtnh{{C{2U5|0D#j8!! z@Mz8@i?^IvsJU^5U20dwScz9^o;PjaVNj*TMgE2_ImU8kWs5ml37j8u7Ymh!bpnCG z-Q&dqV^a%(?#HJC+X!20^2P4Sn79b1c}`&5-EKn#hrqq~a()Aup%}IzQQXJYLD`!( zh0}IY7-e{zFvy-f+Y27)7LZWzaQpx+@aYo|3r??8hZluwwbDf;bZf6yP=1={mpsMC zvec3~+46rC?#blS;)tCc#{D}jdITi*`GAKcaT4;=l;z*y^B5?wt|Q)8RVO$@?X#EM zg~er0r5+sWOT^#~aMa6Dx=MG-inZ89#8H!{%@p?6vQSEf2+}*xmIG90;XcrWGoG+e ze`kxB|1x5eRM!Nt>)_#`D}R;KKE@n^_7}U>pkt9gV<>Z{pfnr}w?6vgjW5HvRH7tP9YEU<=QR-f(i)zH%H)&BY%0_FlquZy}moz{d=?~@E zNbK2?5e-T@H8euF-1Mot-&Eof8f;J|CX}4VmwW(03+E4ciQtQYW6ufeEb?=moV0O+0P|CYF1+1A8Q|%rA-Ck`NuBzbA|iK#T^~p z>dCj|hlvpv#zi-+$#NDj_2(e8{nyb^{(SK0M>it+O_*2R%c(`v!ymJDsS6MPSs9GK zSR#LWoea@-SkQ&E7^%^ZBB2fLY?EL+p1VDPl|^V}@y~kN=HcIE{8fqvs99SlK+FPP zoJm}umF^E}>4{({TYC0?Qc2!jCdl&9DgIlR9AsV%jMMu_3nGO2{}s4KjScTpwi)4w zyV`?y{yssKF={s+GoolhkCi&1EU$7*yMDVNF~I{@>;joY#SPC#e?Ktvjq~ z7CL+2TBlXT((2-OyvA8fvkj!v!?+oEVPP--K-e_#Vu9GhKPejw2z+q8#OtZKPWW`x zOu#-_5_Av48|Lr=@CBxpb9nE!ep6KBI`mivVMk38z_kFYiJL_bg}G8j#NHXF027&E zJxJ=e9F?dT6FJtnd;F6(XfLJ7;&!j7g`w&k`-dTmePgWmkmiLASPHK+0!kyi5)sIv zZ?@|rR4S#0+w9z6#&IQ!Yi(mh*$3@cafL@3B}EY|Rd9Zon*+-XQy$V_%%+ePu8e#L zGkP$VAKbD>?sWNe?b<9o&%Qgfw!`f5Rlw@=UZViS=j>Yu*CXm3BTS1?Uvdes&{KJe zTvP0ckzLgsf=+y%?t+Pp4ci|jz1ODYn+jH~S?H<2ADSfk7X0)ZvHr0lF+T@`T6$82P>%8JOTm%rTel%8pNDEc2I>oq-H zc!yWZoi+aLN3#Bv-miGH__O2?lp?&w#<#}uiN6|DRDbHSbe?&|Sd(I?cM-CZfU#$? z(|=e*VCs^TZ3%PkwRF<`S)1!Ccy}0x6vIF72)q2HAARq}vC0`+5=J39rH|uwU^BNn zR{gP?xLS9BqVLy6XVFd2Lwcw+Rg=s*!}ga{S@EKE2^*si;Z^PiMQbm~(Ws&pfp++A zn%?gKaB=dY?9J&wP6hFV)RuAURTPC+t74+5K&pz=2ikL4;Cc2KeYJBVL_>W}EpiMG zkR4qf12?5i!S;p@&cTrl16Q+UA1U%20Qgusci+v#kx8?cCI!i%M=D!(@DHb**VFUa zQ0YGK2nQ+p8fpaFNDtvhttAj432ZTx-s>KGv#pHn14KXM+sZ6(S=8@t@4SkWzuFLO zNn5_4=K4Jf`xYtR?kJ>3o-L6rU8Fi3|4!y+zs4ju8BPK7L;8@aI^QcwuIaYuDS0I% z;8{Q02)^uA&SVNf-#J!gq2Z2M%V+$e7LdR_|c9OxSp0rgf#sBdKSiy=#|j z32m%9?b3W6PciP9lPa>Xr#|L0!#IJdo*4|xM(b)bTa-F!k1grfG|3^~FDK?Et;U`h zLv4W?vX3(f0i3p0AK1Q;mPYv98EeVs1!&iM?dQ#2bj8^b=-f3iVI;N&1scnbGjY`e zV0lNrml=96339_+;8A|%B3r4wmERB?pZWryoK|}j+&6JJ9AM=zYp5*2@_l(=`98Z4 zJ|C`-3JaM3Ho^H4ag-tS`f#lKo3G8`h6tl=RFCevP80%bgD>5xP`w9lb&x1eq4WSH zn!W6SX-r)G3zd=1-XQt3W7(Bz)ZY$2vFkcEIS&a;YQ%RRCC< zd5x`n0;wgMkGru4GAAm4Tl!?$ggTnP_(S9^Mu$csT3EkOGU@Wv#pB3j+T+2*;|L-Y z;#L)312q>Vt|RbT#cr5?9eU%9-xnXoNC5S3*})2_l05H_5lulgBD5u!l(8r`meB^D zzxG1Ql1i@8Fe71Kj4Np@^S(&UQ{Z{$AAjj9T<@fdH{8;68h+fpF_OV^Qh#nPM*-5@ z84pMthGE+LaE6s1x;pF|DMZYdq23~%yIq=AyhzDc!~x?<)yax~CsE&L_m*IUI~I7p zELbUv;3(E>X83o?|N&eE#8Ju|{0MpgY0jv5DQEB70mL%;FhR z?OG-`T+*U1jz-nM^!2>^OTLe8p8gu>W);ot<@Xw_f5ij_8I! zlHgXRmNA;7C1EsRYlKG>FHMh+WN^3b&qiu7xNtHsbYkE_!&an>r}B2$(bNfM@F2z@ zYXL0iqo}`0?R2T;H^{aON=LYuFXvinCK&|){`^I=A*Y5GKTY$TV*~^euM>(#1lq`2J-Lv zxzri^z0(?VyeuJq_7W5j)Z}vL$u{S@I>HB}3|CFKY*haq!6vDLQUO z!84u@2ZU);V6T&C63HC34EF>TCgFN{wPm25jLIo0z-FVb{#))^owwb-Jqb@mfSG(6tsM=we2 zg&t1>w>mu@!PRHz{U-t^c3|4~vlH|*7yH^1JKrfTwT#d}6{=}4YIuRjD+C5`Zt`v* zQe0l%(hueb(F;DSXP~Cluo+AQO=>1c*z<%T{2UN2UNEX`Qdg>#8hPT^uTu8>C@{?z z&;~k}MfY2 zUC<)RESEB|L#u?w1I-m9g76e^zWimjATDtHvThngm6xRx+%wnUyWI_!*<*lWqX6#e|~J^kZP^)13kC48L5I!hZ#tF5Ha$ zZ}s(OViP5QR+Jw>KkocjCvN*XY9#VAd^)GU1OvF6DJvO4jQTtPH9*S082RX}A2-X2 z^AcQfSTxv7f!G@GgNW>li|}Xq7fA&|@VK=(KX3xX`5pO=h~B_=6!9hw(6;2Qs~`|Bs?kgMl4s>iHau)| zRyT^1y)_vQ&hg(QJ8z)AeDD<=IRwWF4|5E8_-<+lFy`CX$&hxM_I7V(98goAD-3aoJ8ZgDDR8mB5TdGp}O2QL%*cx_3 zY~pd>CMgcxWP6y#?Y{YV zBYwkj%`iFXI=@V}YDTlUdYB>@Yd}v9>o4whtda9ZHw9A*Yd=J7&Ck>JyI^{EOhTJ&m9I6}WAA+$m@@d*~E7onGG&dbUbEW(B$z^At+!1&*? z%40lE)p3oz3-X(K+uezm%vW(I7`J#1+wT>lyLg$%AJoQ5>kgo1pW2b4Zy^n_erKvG zIBwC^z!b+{>Nn```cl3MzcuDhDr(6+CL^2hP0g1_kZxA+FIYUGH|YTu)ebwi->xPn z0r5J_851XLiWxMrrq;Jtk5F#7rjL6NJe9F+;W(e?#5-o}JX<~Dw(k1igIQ5miQ*A;H+ z`rIn3n7Ld}A5(v?1B|3^JBFocH2gAYjoMlAQDxHV-If&bu-+Zu$HJO~w z`rn4c(z((P4?S5#=et}t^-*joEaG$~^Z2fG%UBiLrE*H>s!9w5eB}hw0PAa=H%aJ% z5-obPq(-6hx!fW-4GApO!>!>Lz4>W86zwK&)l`Vp)IvPl0l*<>8uo=Xkd|d0G4nLn zKq33PnfJS}jLVl(iQtTc{o1%(=2#D9AuD+w+Ga+Sap09G9-kXa@-*F?AwJz`^@w<- zyEdD$nc!`a&z3OAm~{??XWXrXX*q+Xe>-8*gLzq3P{LTcG9WiAa&97~3x$xP=J9WC zq3M%}P9V#Py{-H2YP!nA`fY(f6Gp8mO~YIsFjV6)Z3pj@ZZ<2Qys9g$8u&gHa6MJ1 zI=e7HWZ3MOmciexJC2I)ESifl81#s3g{T^-Q{op2;W+$w(X#zZ26`fQ1|>Z5Uf|3& zL(4Of=pLqnJTjCx;jB|XbM96}cE-4)LI∾x5<)wWpg>MV6&Wm0$%apajCf3{({- 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%0DLxYM|#4=%@|T{YXsLJej~TNqiOA<=T~px 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

H% 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ΜmTS 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

H7*CMn8i!Ufao3h^pf=H*KcG# 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 z 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 ofkOeoR=@IN4cGC0YoyML^@S& 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 literal 0 HcmV?d00001 diff --git a/glymur/jp2box.py b/glymur/jp2box.py new file mode 100644 index 0000000..b2ca564 --- /dev/null +++ b/glymur/jp2box.py @@ -0,0 +1,1763 @@ +"""Classes for individual JPEG 2000 boxes. + +Contains classes for each individual JPEG2000 boxes. +""" + +import copy +import math +import os +import struct +import sys +import uuid +import warnings +import xml.etree.cElementTree as ET + +import numpy as np + +from .codestream import Codestream +from .core import _approximation_display +from .core import _colorspace_map_display +from .core import _color_type_map_display +from .core import _method_display +from .core import _reader_requirements_display + + +class Jp2kBox: + """Superclass for JPEG 2000 boxes. + + Attributes + ---------- + id : str + 4-byte identifier for the box. + length : int + length of the box in bytes. + offset : int + offset of the box from the start of the file. + longname : str + more verbose description of the box. + """ + + def __init__(self, id='', offset=0, length=0, longname=''): + self.id = id + self.length = length + self.offset = offset + self.longname = longname + + def __str__(self): + msg = "{0} Box ({1})".format(self.longname, self.id) + msg += " @ ({0}, {1})".format(self.offset, self.length) + return msg + + def _parse_superbox(self, f): + """Parse a superbox (box consisting of nothing but other boxes. + + Parameters + ---------- + f : file + Open file object. + + Returns + ------- + List of top-level boxes in the JPEG 2000 file. + """ + + superbox = [] + + start = f.tell() + + while True: + + # Are we at the end of the superbox? + if start >= self.offset + self.length: + break + + buffer = f.read(8) + (L, T) = struct.unpack('>I4s', buffer) + if sys.hexversion >= 0x03000000: + T = T.decode('utf-8') + + if L == 0: + # The length of the box is presumed to last until the end of + # the file. Compute the effective length of the box. + num_bytes = self._file_size - f.tell() + 8 + + elif L == 1: + # The length of the box is in the XL field, a 64-bit value. + buffer = f.read(8) + num_bytes, = struct.unpack('>Q', buffer) + + else: + num_bytes = L + + # Call the proper parser for the given box with ID "T". + try: + box = _box_with_id[T]._parse(f, T, start, num_bytes) + except KeyError: + msg = 'Unrecognized box ({0}) encountered.'.format(T) + warnings.warn(msg) + box = Jp2kBox(T, offset=start, length=num_bytes, + longname='Unknown box') + + superbox.append(box) + + # Position to the start of the next box. + if num_bytes > self.length: + # Length of the current box goes past the end of the + # enclosing superbox. + msg = '{0} box has incorrect box length ({1})' + msg = msg.format(T, num_bytes) + warnings.warn(msg) + elif f.tell() > start + num_bytes: + # The box must be invalid somehow, as the file pointer is + # positioned past the end of the box. + msg = '{0} box may be invalid, the file pointer is positioned ' + msg += '{1} bytes past the end of the box.' + msg = msg.format(T, f.tell() - (start + num_bytes)) + warnings.warn(msg) + f.seek(start + num_bytes) + + start += num_bytes + + return superbox + + +class ColourSpecificationBox(Jp2kBox): + """Container for JPEG 2000 color specification box information. + + Attributes + ---------- + id : str + 4-byte identifier for the box. + length : int + Length of the box in bytes. + offset : int + Offset of the box from the start of the file. + longname : str + More verbose description of the box. + method : int + Method for defining the colorspace. + precedence : int + How this box ranks in priority compared to other color specification + boxes. + approximation : int + Measure of colorspace accuracy. + color_space : int or None + Enumerated colorspace, corresponds to one of 'sRGB', 'greyscale', or + 'YCC'. If not None, then icc_profile must be None. + icc_profile : byte array or None + ICC profile according to ICC profile specification. If not None, then + color_space must be None. + + References + ---------- + .. [JP2K15444-1i] International Organization for Standardication. ISO/IEC + 15444-1:2004 - Information technology -- JPEG 2000 image coding system: + Core coding system" + """ + def __init__(self, **kwargs): + Jp2kBox.__init__(self, id='', longname='Colour Specification') + self.__dict__.update(**kwargs) + + def __str__(self): + msg = Jp2kBox.__str__(self) + + msg += '\n Method: {0}'.format(_method_display[self.method]) + msg += '\n Precedence: {0}'.format(self.precedence) + + if self.approximation is not 0: + x = _approximation_display[self.approximation] + msg += '\n Approximation: {0}'.format(x) + if self.color_space is not None: + x = _colorspace_map_display[self.color_space] + msg += '\n Colorspace: {0}'.format(x) + else: + x = len(self.icc_profile) + msg += '\n ICC Profile: {0} bytes'.format(x) + + return msg + + @staticmethod + def _parse(f, id, offset, length): + """Parse JPEG 2000 color specification box. + + Parameters + ---------- + f : file + Open file object. + id : byte + 4-byte unique identifier for this box. + offset : int + Start position of box in bytes. + length : int + Length of the box in bytes. + + Returns + ------- + kwargs : dictionary + dictionary of parameter values + """ + kwargs = {} + kwargs['id'] = id + kwargs['length'] = length + kwargs['offset'] = offset + + # Read the brand, minor version. + buffer = f.read(3) + (method, precedence, approximation) = struct.unpack('>BBB', buffer) + kwargs['method'] = method + kwargs['precedence'] = precedence + kwargs['approximation'] = approximation + + if method == 1: + # enumerated colour space + buffer = f.read(4) + kwargs['color_space'], = struct.unpack('>I', buffer) + kwargs['icc_profile'] = None + + else: + # ICC profile + kwargs['color_space'] = None + n = offset + length - f.tell() + kwargs['icc_profile'] = f.read(n) + + box = ColourSpecificationBox(**kwargs) + return box + + +class ComponentDefinitionBox(Jp2kBox): + """Container for component definition box information. + + Attributes + ---------- + id : str + 4-byte identifier for the box. + length : numeric scalar + length of the box in bytes. + offset : int + offset of the box from the start of the file. + longname : str + more verbose description of the box. + component_number : int + number of the component + component_type : int + type of the component + association : int + number of the associated color + + References + ---------- + .. [JP2K15444-1i] International Organization for Standardication. ISO/IEC + 15444-1:2004 - Information technology -- JPEG 2000 image coding system: + Core coding system" + """ + def __init__(self, **kwargs): + Jp2kBox.__init__(self, id='', longname='Component Definition') + self.__dict__.update(**kwargs) + + def __str__(self): + msg = Jp2kBox.__str__(self) + for j in range(len(self.association)): + color_type_string = _color_type_map_display[self.component_type[j]] + if self.association[j] == 0: + assn = 'whole image' + else: + assn = str(self.association[j]) + msg += '\n Component {0} ({1}) ==> ({2})' + msg = msg.format(self.component_number[j], color_type_string, assn) + return msg + + @staticmethod + def _parse(f, id, offset, length): + """Parse component definition box. + + Parameters + ---------- + f : file + Open file object. + id : byte + 4-byte unique identifier for this box. + offset : int + Start position of box in bytes. + length : int + Length of the box in bytes. + + Returns + ------- + kwargs : dictionary of parameter values + """ + kwargs = {} + kwargs['id'] = id + kwargs['length'] = length + kwargs['offset'] = offset + + # Read the number of components. + buffer = f.read(2) + N, = struct.unpack('>H', buffer) + + component_number = [] + component_type = [] + association = [] + + buffer = f.read(N * 6) + data = struct.unpack('>' + 'HHH' * N, buffer) + kwargs['component_number'] = data[0:N * 6:3] + kwargs['component_type'] = data[1:N * 6:3] + kwargs['association'] = data[2:N * 6:3] + + box = ComponentDefinitionBox(**kwargs) + return box + + +class ComponentMappingBox(Jp2kBox): + """Container for channel identification information. + + Attributes + ---------- + id : str + 4-byte identifier for the box. + length : numeric scalar + Length of the box in bytes. + offset : int + Offset of the box from the start of the file. + longname : str + Verbose description of the box. + component_index : int + Index of component in codestream that is mapped to this channel. + mapping_type : int + mapping type, either direct use (0) or palette (1) + palette_index : int + Index component from palette + + References + ---------- + .. [JP2K15444-1i] International Organization for Standardication. ISO/IEC + 15444-1:2004 - Information technology -- JPEG 2000 image coding system: + Core coding system" + """ + def __init__(self, **kwargs): + Jp2kBox.__init__(self, id='', longname='Component Mapping') + self.__dict__.update(**kwargs) + + def __str__(self): + msg = Jp2kBox.__str__(self) + + for k in range(len(self.component_index)): + if self.mapping_type[k] == 1: + msg += '\n Component {0} ==> palette column {1}' + msg = msg.format(self.component_index[k], + self.palette_index[k]) + else: + msg += '\n Component %d ==> %d' + msg = msg.format(self.component_index[k], k) + return msg + + @staticmethod + def _parse(f, id, offset, length): + """Parse component mapping box. + + Parameters + ---------- + f : file + Open file object. + id : byte + 4-byte unique identifier for this box. + offset : int + Start position of box in bytes. + length : int + Length of the box in bytes. + + Returns + ------- + kwargs : dictionary of parameter values + """ + kwargs = {} + kwargs['id'] = id + kwargs['length'] = length + kwargs['offset'] = offset + + N = offset + length - f.tell() + num_components = int(N/4) + + buffer = f.read(N) + data = struct.unpack('>' + 'HBB' * num_components, buffer) + + kwargs['component_index'] = data[0:N:num_components] + kwargs['mapping_type'] = data[1:N:num_components] + kwargs['palette_index'] = data[2:N:num_components] + + box = ComponentMappingBox(**kwargs) + return box + + +class ContiguousCodestreamBox(Jp2kBox): + """Container for JPEG2000 codestream information. + + Attributes + ---------- + id : str + 4-byte identifier for the box. + length : int + length of the box in bytes. + offset : int + offset of the box from the start of the file. + longname : str + more verbose description of the box. + main_header : list + List of segments in the codestream header. + + References + ---------- + .. [JP2K15444-1i] International Organization for Standardication. ISO/IEC + 15444-1:2004 - Information technology -- JPEG 2000 image coding system: + Core coding system" + """ + + def __init__(self, **kwargs): + Jp2kBox.__init__(self, id='jp2c', longname='Contiguous Codestream') + self.__dict__.update(**kwargs) + + def __str__(self): + msg = Jp2kBox.__str__(self) + msg += '\n Main header:' + for segment in self.main_header.segment: + segstr = segment.__str__() + + # Add indentation. + strs = [('\n ' + x) for x in segstr.split('\n')] + msg += ''.join(strs) + return msg + + @staticmethod + def _parse(f, id='jp2c', offset=0, length=0): + """Parse a codestream box. + + Parameters + ---------- + f : file + Open file object. + id : byte + 4-byte unique identifier for this box. + offset : int + Start position of box in bytes. + length : int + Length of the box in bytes. + + Returns + ------- + kwargs : dictionary of parameter values + """ + kwargs = {} + kwargs['id'] = id + kwargs['length'] = length + kwargs['offset'] = offset + + kwargs['main_header'] = Codestream(f, header_only=True) + + box = ContiguousCodestreamBox(**kwargs) + return box + + +class FileTypeBox(Jp2kBox): + """Container for JPEG 2000 file type box information. + + Attributes + ---------- + id : str + 4-byte identifier for the box. + length : int + length of the box in bytes. + offset : int + offset of the box from the start of the file. + longname : str + more verbose description of the box. + brand: str + Specifies the governing recommendation or standard upon which this + file is based. + minor_version: int + Minor version number identifying the JP2 specification used. + compatibility_list: list + List of file conformance profiles. + + References + ---------- + .. [JP2K15444-1i] International Organization for Standardication. ISO/IEC + 15444-1:2004 - Information technology -- JPEG 2000 image coding system: + Core coding system" + """ + def __init__(self, **kwargs): + Jp2kBox.__init__(self, id='', longname='File Type') + self.__dict__.update(**kwargs) + + def __str__(self): + lst = [Jp2kBox.__str__(self), + ' Brand: {0}', + ' Compatibility: {1}'] + msg = '\n'.join(lst) + msg = msg.format(self.brand, self.compatibility_list) + + return msg + + @staticmethod + def _parse(f, id, offset, length): + """Parse JPEG 2000 file type box. + + Parameters + ---------- + f : file + Open file object. + id : byte + 4-byte unique identifier for this box. + offset : int + Start position of box in bytes. + length : int + Length of the box in bytes. + + Returns: + kwargs: dictionary of parameter values + """ + kwargs = {} + kwargs['id'] = id + kwargs['length'] = length + kwargs['offset'] = offset + + # Read the brand, minor version. + buffer = f.read(8) + (brand, minor_version) = struct.unpack('>4sI', buffer) + if sys.hexversion < 0x030000: + kwargs['brand'] = brand + else: + kwargs['brand'] = brand.decode('utf-8') + kwargs['minor_version'] = minor_version + + # Read the compatibility list. Each entry has 4 bytes. + current_pos = f.tell() + n = (offset + length - current_pos) / 4 + buffer = f.read(int(n) * 4) + compatibility_list = [] + for j in range(int(n)): + CL, = struct.unpack('>4s', buffer[4*j:4*(j+1)]) + if sys.hexversion >= 0x03000000: + CL = CL.decode('utf-8') + compatibility_list.append(CL) + + kwargs['compatibility_list'] = compatibility_list + + box = FileTypeBox(**kwargs) + return box + + +class ImageHeaderBox(Jp2kBox): + """Container for JPEG 2000 image header box information. + + Attributes + ---------- + id : str + 4-byte identifier for the box. + length : int + length of the box in bytes. + offset : int + offset of the box from the start of the file. + longname : str + more verbose description of the box. + height, width : int + Height and width of image. + num_components : int + Number of image channels. + bits_per_component : int + Bits per component. + signed : bool + False if the image components are unsigned. + compression : nt + The compression type, should be 7 if JP2. + cspace_unknown : int + 0 if the color space is known and correctly specified. + ip_provided : int + 0 if the file does not contain intellectual propery rights information. + + References + ---------- + .. [JP2K15444-1i] International Organization for Standardication. ISO/IEC + 15444-1:2004 - Information technology -- JPEG 2000 image coding system: + Core coding system" + """ + def __init__(self, **kwargs): + Jp2kBox.__init__(self, id='', longname='Image Header') + self.__dict__.update(**kwargs) + + def __str__(self): + lst = [Jp2kBox.__str__(self)] + lst.append('Size: [{0} {1} {2}]'.format(self.height, self.width, + self.num_components)) + lst.append('Bitdepth: {0}'.format(self.bits_per_component)) + lst.append('Signed: {0}'.format(self.signed)) + if self.compression == 7: + lst.append('Compression: wavelet') + if self.cspace_unknown: + lst.append('Colorspace Unknown: True') + else: + lst.append('Colorspace Unknown: False') + return '\n '.join(lst) + + @staticmethod + def _parse(f, id, offset, length): + """Parse JPEG 2000 image header box. + + Parameters + ---------- + f : file + Open file object. + id : byte + 4-byte unique identifier for this box. + offset : int + Start position of box in bytes. + length : int + Length of the box in bytes. + + Returns: + kwargs: dictionary of parameter values + """ + kwargs = {} + kwargs['id'] = id + kwargs['length'] = length + kwargs['offset'] = offset + + # Read the box information + buffer = f.read(14) + params = struct.unpack('>IIHBBBB', buffer) + kwargs['height'] = params[0] + kwargs['width'] = params[1] + kwargs['num_components'] = params[2] + kwargs['bits_per_component'] = (params[3] & 0x7f) + 1 + kwargs['signed'] = (params[3] & 0x80) > 1 + kwargs['compression'] = params[4] + kwargs['cspace_unknown'] = params[5] + kwargs['ip_provided'] = params[6] + + box = ImageHeaderBox(**kwargs) + return box + + +class AssociationBox(Jp2kBox): + """Container for Association box information. + + Attributes + ---------- + id : str + 4-byte identifier for the box. + length : int + length of the box in bytes. + offset : int + offset of the box from the start of the file. + longname : str + more verbose description of the box. + box : list + List of boxes contained in this superbox. + + References + ---------- + .. [JP2K15444-2m] International Organization for Standardication. ISO/IEC + 15444-2:2004 - Information technology -- JPEG 2000 image coding system: + Extensions + """ + def __init__(self, **kwargs): + Jp2kBox.__init__(self, id='', longname='Association') + self.__dict__.update(**kwargs) + + def __str__(self): + msg = Jp2kBox.__str__(self) + for box in self.box: + boxstr = box.__str__() + + # Add indentation. + strs = [('\n ' + x) for x in boxstr.split('\n')] + msg += ''.join(strs) + return msg + + @staticmethod + def _parse(f, id, offset, length): + """Parse association box. + + Parameters + ---------- + f : file + Open file object. + id : byte + 4-byte unique identifier for this box. + offset : int + Start position of box in bytes. + length : int + Length of the box in bytes. + + Returns + ------- + kwargs : dictionary of parameter values, for now just a single + 4-byte tuple. + """ + kwargs = {} + kwargs['id'] = id + kwargs['length'] = length + kwargs['offset'] = offset + + box = AssociationBox(**kwargs) + + # The JP2 header box is a superbox, so go ahead and parse its child + # boxes. + box.box = box._parse_superbox(f) + + return box + + +class JP2HeaderBox(Jp2kBox): + """Container for JP2 header box information. + + Attributes + ---------- + id : str + 4-byte identifier for the box. + length : int + length of the box in bytes. + offset : int + offset of the box from the start of the file. + longname : str + more verbose description of the box. + box : list + List of boxes contained in this superbox. + + References + ---------- + .. [JP2K15444-1i] International Organization for Standardication. ISO/IEC + 15444-1:2004 - Information technology -- JPEG 2000 image coding system: + Core coding system" + """ + def __init__(self, **kwargs): + Jp2kBox.__init__(self, id='', longname='JP2 Header') + self.__dict__.update(**kwargs) + + def __str__(self): + msg = Jp2kBox.__str__(self) + for box in self.box: + boxstr = box.__str__() + + # Add indentation. + strs = [('\n ' + x) for x in boxstr.split('\n')] + msg += ''.join(strs) + return msg + + @staticmethod + def _parse(f, id, offset, length): + """Parse JPEG 2000 header box. + + Parameters + ---------- + f : file + Open file object. + id : byte + 4-byte unique identifier for this box. + offset : int + Start position of box in bytes. + length : int + Length of the box in bytes. + + Returns + ------- + kwargs : dictionary of parameter values, for now just a single + 4-byte tuple. + """ + kwargs = {} + kwargs['id'] = id + kwargs['length'] = length + kwargs['offset'] = offset + + box = JP2HeaderBox(**kwargs) + + # The JP2 header box is a superbox, so go ahead and parse its child + # boxes. + box.box = box._parse_superbox(f) + + return box + + +class JPEG2000SignatureBox(Jp2kBox): + """Container for JPEG 2000 signature box information. + + Attributes + ---------- + id : str + 4-byte identifier for the box. + length : int + length of the box in bytes. + offset : int + offset of the box from the start of the file. + longname : str + more verbose description of the box. + signature : byte + Four-byte tuple identifying the file as JPEG 2000. + + References + ---------- + .. [JP2K15444-1i] International Organization for Standardication. ISO/IEC + 15444-1:2004 - Information technology -- JPEG 2000 image coding system: + Core coding system" + """ + def __init__(self, **kwargs): + Jp2kBox.__init__(self, id='', longname='JPEG 2000 Signature') + self.__dict__.update(**kwargs) + + def __str__(self): + msg = Jp2kBox.__str__(self) + msg += '\n Signature: {:02x}{:02x}{:02x}{:02x}' + msg = msg.format(*self.signature) + return msg + + @staticmethod + def _parse(f, id, offset, length): + """Parse JPEG 2000 signature box. + + Parameters + ---------- + f : file + Open file object. + id : byte + 4-byte unique identifier for this box. + offset : int + Start position of box in bytes. + length : int + Length of the box in bytes. + + Returns: + kwargs: dictionary of parameter values, for now just a single + 4-byte tuple. + """ + kwargs = {} + kwargs['id'] = id + kwargs['length'] = length + kwargs['offset'] = offset + + buffer = f.read(4) + kwargs['signature'] = struct.unpack('>BBBB', buffer) + + box = JPEG2000SignatureBox(**kwargs) + return box + + +class PaletteBox(Jp2kBox): + """Container for palette box information. + + Attributes + ---------- + id : str + 4-byte identifier for the box. + length : int + length of the box in bytes. + offset : int + offset of the box from the start of the file. + longname : str + more verbose description of the box. + palette : list + Colormap represented as list of 1D arrays, one per color component. + + References + ---------- + .. [JP2K15444-1i] International Organization for Standardication. ISO/IEC + 15444-1:2004 - Information technology -- JPEG 2000 image coding system: + Core coding system" + """ + def __init__(self, **kwargs): + Jp2kBox.__init__(self, id='', longname='Palette') + self.__dict__.update(**kwargs) + + def __str__(self): + msg = Jp2kBox.__str__(self) + msg += '\n Size: ({0} x {1})'.format(len(self.palette[0]), + len(self.palette)) + return msg + + @staticmethod + def _parse(f, id, offset, length): + """Parse palette box. + + Parameters + ---------- + f : file + Open file object. + id : byte + 4-byte unique identifier for this box. + offset : int + Start position of box in bytes. + length : int + Length of the box in bytes. + + Returns + ------- + kwargs: dictionary of parameter values + """ + kwargs = {} + kwargs['id'] = id + kwargs['length'] = length + kwargs['offset'] = offset + + # Get the size of the palette. + buffer = f.read(3) + (NE, NC) = struct.unpack('>HB', buffer) + + # Need to determine bps and signed or not + buffer = f.read(NC) + data = struct.unpack('>' + 'B' * NC, buffer) + bps = [((x & 0x07f) + 1) for x in data] + signed = [((x & 0x80) > 1) for x in data] + kwargs['bits_per_component'] = bps + kwargs['signed'] = signed + + # Form the format string so that we can intelligently unpack the + # colormap. We have to do this because it is possible that the + # colormap columns could have different datatypes. + # + # This means that we store the palette as a list of 1D arrays, + # which reverses the usual indexing scheme. + palette = [] + fmt = '>' + bytes_per_row = 0 + for j in range(NC): + if bps[j] <= 8: + fmt += 'B' + bytes_per_row += 1 + palette.append(np.zeros(NE, dtype=np.uint8)) + elif bps[j] <= 16: + fmt += 'H' + bytes_per_row += 2 + palette.append(np.zeros(NE, dtype=np.uint16)) + elif bps[j] <= 32: + fmt += 'I' + bytes_per_row += 4 + palette.append(np.zeros(NE, dtype=np.uint32)) + else: + msg = 'Unsupported palette bitdepth (%d).' + raise IOError(msg) + n = NE * bytes_per_row + buffer = f.read(n) + + for j in range(NE): + row_buffer = buffer[(bytes_per_row * j):(bytes_per_row * (j + 1))] + row = struct.unpack(fmt, row_buffer) + for k in range(NC): + palette[k][j] = row[k] + + kwargs['palette'] = palette + box = PaletteBox(**kwargs) + return box + + +class ReaderRequirementsBox(Jp2kBox): + """Container for reader requirements box information. + + Attributes + ---------- + id : str + 4-byte identifier for the box. + length : int + length of the box in bytes. + offset : int + offset of the box from the start of the file. + longname : str + more verbose description of the box. + FUAM : int + Fully Understand Aspects mask. + DCM : int + Decode completely mask. + standard_flag : list + Integers specifying standard features. + standard_mask : list + Specifies the compatibility mask for each corresponding standard + flag. + vendor_feature : list + Each item is a UUID corresponding to a vendor defined feature. + vendor_mask : list + Specifies the compatibility mask for each corresponding vendor + feature. + + References + ---------- + .. [JP2K15444-2m] International Organization for Standardication. ISO/IEC + 15444-2:2004 - Information technology -- JPEG 2000 image coding system: + Extensions + """ + def __init__(self, **kwargs): + Jp2kBox.__init__(self, id='', longname='Reader Requirements') + self.__dict__.update(**kwargs) + + def __str__(self): + msg = Jp2kBox.__str__(self) + + # TODO: include FUAM, DCM + + msg += '\n Standard Features:' + # TODO: include each standard mask + for j in range(len(self.standard_flag)): + sfl = self.standard_flag[j] + rrdisp = _reader_requirements_display[self.standard_flag[j]] + msg += '\n Feature {0:03d}: {1}'.format(sfl, rrdisp) + + # TODO: include the vendor mask + msg += '\n Vendor Features:' + for j in range(len(self.vendor_feature)): + msg += '\n UUID {0}'.format(self.vendor_feature[j]) + + return msg + + @staticmethod + def _parse(f, id, offset, length): + """Parse reader requirements box. + + Parameters + ---------- + f : file + Open file object. + id : byte + 4-byte unique identifier for this box. + offset : int + Start position of box in bytes. + length : int + Length of the box in bytes. + + Returns + ------- + ReaderRequirementsBox. + """ + kwargs = {} + kwargs['id'] = id + kwargs['length'] = length + kwargs['offset'] = offset + + buffer = f.read(1) + mask_length, = struct.unpack('>B', buffer) + if mask_length == 1: + mask_format = 'B' + elif mask_length == 2: + mask_format = 'H' + elif mask_length == 4: + mask_format = 'I' + else: + msg = 'Unhandled reader requirements box mask length (%d).' + msg %= mask_length + raise RuntimeError(msg) + + # Fully Understands Aspect Mask + # Decodes Completely Mask + buffer = f.read(2 * mask_length) + data = struct.unpack('>' + mask_format * 2, buffer) + kwargs['FUAM'] = data[0] + kwargs['DCM'] = data[1] + + buffer = f.read(2) + num_standard_flags, = struct.unpack('>H', buffer) + + # Read in standard flags and standard masks. Each standard flag should + # be two bytes, but the standard mask flag is as long as specified by + # the mask length. + buffer = f.read(num_standard_flags * (2 + mask_length)) + data = struct.unpack('>' + ('H' + mask_format) * num_standard_flags, + buffer) + kwargs['standard_flag'] = data[0:num_standard_flags * 2:2] + kwargs['standard_mask'] = data[1:num_standard_flags * 2:2] + + # Vendor features + buffer = f.read(2) + num_vendor_features, = struct.unpack('>H', buffer) + + # Each vendor feature consists of a 16-byte UUID plus a mask whose + # length is specified by, you guessed it, "mask_length". + entry_length = 16 + mask_length + buffer = f.read(num_vendor_features * entry_length) + vendor_feature = [] + vendor_mask = [] + for j in range(num_vendor_features): + ubuffer = buffer[j * entry_length:(j + 1) * entry_length] + vendor_feature.append(uuid.UUID(bytes=ubuffer[0:16])) + + vm = struct.unpack('>' + mask_format, ubuffer[16:]) + vendor_mask.append(vm) + + kwargs['vendor_feature'] = vendor_feature + kwargs['vendor_mask'] = vendor_mask + + box = ReaderRequirementsBox(**kwargs) + return box + + +class ResolutionBox(Jp2kBox): + """Container for Resolution superbox information. + + Attributes + ---------- + id : str + 4-byte identifier for the box. + length : int + length of the box in bytes. + offset : int + offset of the box from the start of the file. + longname : str + more verbose description of the box. + box : list + List of boxes contained in this superbox. + + References + ---------- + .. [JP2K15444-1i] International Organization for Standardication. ISO/IEC + 15444-1:2004 - Information technology -- JPEG 2000 image coding system: + Core coding system" + """ + def __init__(self, **kwargs): + Jp2kBox.__init__(self, id='', longname='Resolution') + self.__dict__.update(**kwargs) + + def __str__(self): + msg = Jp2kBox.__str__(self) + for box in self.box: + boxstr = box.__str__() + + # Add indentation. + strs = [('\n ' + x) for x in boxstr.split('\n')] + msg += ''.join(strs) + return msg + + @staticmethod + def _parse(f, id, offset, length): + """Parse Resolution box. + + Parameters + ---------- + f : file + Open file object. + id : byte + 4-byte unique identifier for this box. + offset : int + Start position of box in bytes. + length : int + Length of the box in bytes. + + Returns + ------- + kwargs : dictionary of parameter values, for now just a single + 4-byte tuple. + """ + kwargs = {} + kwargs['id'] = id + kwargs['length'] = length + kwargs['offset'] = offset + + box = ResolutionBox(**kwargs) + + # The JP2 header box is a superbox, so go ahead and parse its child + # boxes. + box.box = box._parse_superbox(f) + + return box + + +class CaptureResolutionBox(ResolutionBox): + """Container for Capture resolution box information. + + Attributes + ---------- + id : str + 4-byte identifier for the box. + length : int + length of the box in bytes. + offset : int + offset of the box from the start of the file. + longname : str + more verbose description of the box. + VR, HR : float + Vertical, horizontal resolution. + + References + ---------- + .. [JP2K15444-1i] International Organization for Standardication. ISO/IEC + 15444-1:2004 - Information technology -- JPEG 2000 image coding system: + Core coding system" + """ + def __init__(self, **kwargs): + ResolutionBox.__init__(self, id='', longname='Capture Resolution') + self.__dict__.update(**kwargs) + + def __str__(self): + msg = Jp2kBox.__str__(self) + msg += '\n VCR: {0}'.format(self.VR) + msg += '\n HCR: {0}'.format(self.HR) + return msg + + @staticmethod + def _parse(f, id, offset, length): + """Parse Resolution box. + + Parameters + ---------- + f : file + Open file object. + id : byte + 4-byte unique identifier for this box. + offset : int + Start position of box in bytes. + length : int + Length of the box in bytes. + + Returns + ------- + kwargs : dictionary of parameter values, for now just a single + 4-byte tuple. + """ + kwargs = {} + kwargs['id'] = id + kwargs['length'] = length + kwargs['offset'] = offset + + buffer = f.read(10) + (RN1, RD1, RN2, RD2, RE1, RE2) = struct.unpack('>HHHHBB', buffer) + kwargs['VR'] = RN1 / RD1 * math.pow(10, RE1) + kwargs['HR'] = RN2 / RD2 * math.pow(10, RE2) + + box = CaptureResolutionBox(**kwargs) + + return box + + +class DisplayResolutionBox(ResolutionBox): + """Container for Display resolution box information. + + Attributes + ---------- + id : str + 4-byte identifier for the box. + length : int + length of the box in bytes. + offset : int + offset of the box from the start of the file. + longname : str + more verbose description of the box. + VR, HR : float + Vertical, horizontal resolution. + + References + ---------- + .. [JP2K15444-1i] International Organization for Standardication. ISO/IEC + 15444-1:2004 - Information technology -- JPEG 2000 image coding system: + Core coding system" + """ + def __init__(self, **kwargs): + ResolutionBox.__init__(self, id='', longname='Display Resolution') + self.__dict__.update(**kwargs) + + def __str__(self): + msg = Jp2kBox.__str__(self) + msg += '\n VDR: {0}'.format(self.VR) + msg += '\n HDR: {0}'.format(self.HR) + return msg + + @staticmethod + def _parse(f, id, offset, length): + """Parse Resolution box. + + Parameters + ---------- + f : file + Open file object. + id : byte + 4-byte unique identifier for this box. + offset : int + Start position of box in bytes. + length : int + Length of the box in bytes. + + Returns + ------- + kwargs : dictionary of parameter values, for now just a single + 4-byte tuple. + """ + kwargs = {} + kwargs['id'] = id + kwargs['length'] = length + kwargs['offset'] = offset + + buffer = f.read(10) + (RN1, RD1, RN2, RD2, RE1, RE2) = struct.unpack('>HHHHBB', buffer) + kwargs['VR'] = RN1 / RD1 * math.pow(10, RE1) + kwargs['HR'] = RN2 / RD2 * math.pow(10, RE2) + + box = DisplayResolutionBox(**kwargs) + + return box + + +class LabelBox(Jp2kBox): + """Container for Label box information. + + Attributes + ---------- + id : str + 4-byte identifier for the box. + length : int + length of the box in bytes. + offset : int + offset of the box from the start of the file. + longname : str + more verbose description of the box. + label : str + Label + + References + ---------- + .. [JP2K15444-2m] International Organization for Standardication. ISO/IEC + 15444-2:2004 - Information technology -- JPEG 2000 image coding system: + Extensions + """ + def __init__(self, **kwargs): + Jp2kBox.__init__(self, id='', longname='Label') + self.__dict__.update(**kwargs) + + def __str__(self): + msg = Jp2kBox.__str__(self) + msg += '\n Label: {0}'.format(self.label) + return msg + + @staticmethod + def _parse(f, id, offset, length): + """Parse Label box. + + Parameters + ---------- + f : file + Open file object. + id : byte + 4-byte unique identifier for this box. + offset : int + Start position of box in bytes. + length : int + Length of the box in bytes. + + Returns + ------- + kwargs : dictionary of parameter values + """ + kwargs = {} + kwargs['id'] = id + kwargs['length'] = length + kwargs['offset'] = offset + + num_bytes = offset + length - f.tell() + buffer = f.read(num_bytes) + kwargs['label'] = buffer.decode('utf-8') + box = LabelBox(**kwargs) + return box + + +class XMLBox(Jp2kBox): + """Container for XML box information. + + Attributes + ---------- + id : str + 4-byte identifier for the box. + length : int + length of the box in bytes. + offset : int + offset of the box from the start of the file. + longname : str + more verbose description of the box. + xml : ElementTree.Element + XML section. + + References + ---------- + .. [JP2K15444-1i] International Organization for Standardication. ISO/IEC + 15444-1:2004 - Information technology -- JPEG 2000 image coding system: + Core coding system" + """ + def __init__(self, **kwargs): + Jp2kBox.__init__(self, id='', longname='XML') + self.__dict__.update(**kwargs) + + def indent(self, elem, level=0): + """recipe for pretty printing XML. Please see + + http://effbot.org/zone/element-lib.htm#prettyprint + """ + i = "\n" + level * " " + if len(elem): + if not elem.text or not elem.text.strip(): + elem.text = i + " " + if not elem.tail or not elem.tail.strip(): + elem.tail = i + for elem in elem: + self.indent(elem, level + 1) + if not elem.tail or not elem.tail.strip(): + elem.tail = i + else: + if level and (not elem.tail or not elem.tail.strip()): + elem.tail = i + + def __str__(self): + msg = Jp2kBox.__str__(self) + xml = self.xml + if self.xml is not None: + xml = copy.deepcopy(self.xml) + self.indent(xml) + xmltext = ET.tostring(xml).decode('utf-8') + + # Indent it a bit. + lst = [(' ' + x) for x in xmltext.split('\n')] + xml = '\n'.join(lst) + msg += '\n{0}'.format(xml) + else: + msg += '\n {0}'.format(xml) + return msg + + @staticmethod + def _parse(f, id, offset, length): + """Parse XML box. + + Parameters + ---------- + f : file + Open file object. + id : byte + 4-byte unique identifier for this box. + offset : int + Start position of box in bytes. + length : int + Length of the box in bytes. + + Returns + ------- + kwargs : dictionary of parameter values + """ + kwargs = {} + kwargs['id'] = id + kwargs['length'] = length + kwargs['offset'] = offset + + num_bytes = offset + length - f.tell() + buffer = f.read(num_bytes) + text = buffer.decode('utf-8') + + # Strip out any trailing nulls. + text = text.rstrip('\0') + + try: + kwargs['xml'] = ET.fromstring(text) + except ET.ParseError as e: + msg = 'A problem was encountered while parsing an XML box: "{0}"' + msg = msg.format(str(e)) + warnings.warn(msg, UserWarning) + kwargs['xml'] = None + + box = XMLBox(**kwargs) + return box + + +class UUIDListBox(Jp2kBox): + """Container for JPEG 2000 UUID list box. + + Attributes + ---------- + id : str + 4-byte identifier for the box. + length : int + length of the box in bytes. + offset : int + offset of the box from the start of the file. + longname : str + more verbose description of the box. + ulst : list + List of UUIDs. + + References + ---------- + .. [JP2K15444-1i] International Organization for Standardication. ISO/IEC + 15444-1:2004 - Information technology -- JPEG 2000 image coding system: + Core coding system" + """ + def __init__(self, **kwargs): + Jp2kBox.__init__(self, id='', longname='UUID List') + self.__dict__.update(**kwargs) + + def __str__(self): + msg = Jp2kBox.__str__(self) + for enumerated_item in enumerate(self.ulst): + msg += '\n UUID[{0}]: {1}'.format(*enumerated_item) + return(msg) + + @staticmethod + def _parse(f, id, offset, length): + """Parse UUIDList box. + + Parameters + ---------- + f : file + Open file object. + id : byte + 4-byte unique identifier for this box. + offset : int + Start position of box in bytes. + length : int + Length of the box in bytes. + + Returns + ------- + kwargs : dictionary of parameter values + """ + buffer = f.read(2) + N, = struct.unpack('>H', buffer) + + ulst = [] + for j in range(N): + buffer = f.read(16) + ulst.append(uuid.UUID(bytes=buffer)) + + kwargs = {} + kwargs['id'] = id + kwargs['offset'] = offset + kwargs['length'] = length + kwargs['ulst'] = ulst + box = UUIDListBox(**kwargs) + return(box) + + +class UUIDInfoBox(Jp2kBox): + """Container for JPEG 2000 UUID Info superbox. + + Attributes + ---------- + id : str + 4-byte identifier for the box. + length : int + length of the box in bytes. + offset : int + offset of the box from the start of the file. + longname : str + more verbose description of the box. + box : list + List of boxes contained in this superbox. + + References + ---------- + .. [JP2K15444-1i] International Organization for Standardication. ISO/IEC + 15444-1:2004 - Information technology -- JPEG 2000 image coding system: + Core coding system" + """ + def __init__(self, **kwargs): + Jp2kBox.__init__(self, id='', longname='UUIDInfo') + self.__dict__.update(**kwargs) + + def __str__(self): + msg = Jp2kBox.__str__(self) + + for box in self.box: + box_str = box.__str__() + + # Add indentation. + lst = [('\n ' + x) for x in box_str.split('\n')] + msg += ''.join(lst) + + return(msg) + + @staticmethod + def _parse(f, id, offset, length): + """Parse UUIDInfo super box. + + Parameters + ---------- + f : file + Open file object. + id : byte + 4-byte unique identifier for this box. + offset : int + Start position of box in bytes. + length : int + Length of the box in bytes. + + Returns + ------- + kwargs : dictionary of parameter values + """ + kwargs = {} + kwargs['id'] = id + kwargs['length'] = length + kwargs['offset'] = offset + + box = UUIDInfoBox(**kwargs) + + # The UUIDInfo box is a superbox, so go ahead and parse its child + # boxes. + box.box = box._parse_superbox(f) + + return box + + +class DataEntryURLBox(Jp2kBox): + """Container for data entry URL box information. + + Attributes + ---------- + id : str + 4-byte identifier for the box. + length : int + length of the box in bytes. + offset : int + offset of the box from the start of the file. + longname : str + more verbose description of the box. + version : byte + Must be 0 for JP2. + flag : bytes + Particular attributes of this box, consists of three bytes. + URL : str + Associated URL. + + References + ---------- + .. [JP2K15444-1i] International Organization for Standardication. ISO/IEC + 15444-1:2004 - Information technology -- JPEG 2000 image coding system: + Core coding system" + """ + def __init__(self, **kwargs): + Jp2kBox.__init__(self, id='', longname='Data Entry URL') + self.__dict__.update(**kwargs) + + def __str__(self): + msg = Jp2kBox.__str__(self) + msg += '\n ' + + lines = ['Version: {0}', + 'Flag: {1} {2} {3}', + 'URL: "{4}"'] + msg += '\n '.join(lines) + msg = msg.format(self.version, + self.flag[0], self.flag[1], self.flag[2], + self.URL) + return msg + + @staticmethod + def _parse(f, id, offset, length): + """Parse Data Entry URL box. + + Parameters + ---------- + f : file + Open file object. + id : byte + 4-byte unique identifier for this box. + offset : int + Start position of box in bytes. + length : int + Length of the box in bytes. + + Returns + ------- + kwargs : dictionary of parameter values + """ + kwargs = {} + kwargs['id'] = id + kwargs['length'] = length + kwargs['offset'] = offset + + buffer = f.read(4) + data = struct.unpack('>BBBB', buffer) + kwargs['version'] = data[0] + kwargs['flag'] = data[1:4] + + n = offset + length - f.tell() + buffer = f.read(n) + kwargs['URL'] = buffer.decode('utf-8') + box = DataEntryURLBox(**kwargs) + return box + + +class UUIDBox(Jp2kBox): + """Container for UUID box information. + + Attributes + ---------- + id : str + 4-byte identifier for the box. + length : int + length of the box in bytes. + offset : int + offset of the box from the start of the file. + longname : str + more verbose description of the box. + uuid : uuid.UUID + 16-byte UUID + data : bytes + Vendor-specific UUID data. + + References + ---------- + .. [JP2K15444-1i] International Organization for Standardication. ISO/IEC + 15444-1:2004 - Information technology -- JPEG 2000 image coding system: + Core coding system" + """ + def __init__(self, **kwargs): + Jp2kBox.__init__(self, id='', longname='UUID') + self.__dict__.update(**kwargs) + + def __str__(self): + msg = Jp2kBox.__str__(self) + msg += '\n UUID: {0}'.format(self.uuid) + msg += '\n UUID Data: {0} bytes'.format(len(self.data)) + return msg + + @staticmethod + def _parse(f, id, offset, length): + """Parse JPEG 2000 signature box. + + Parameters + ---------- + f : file + Open file object. + id : str + 4-byte unique identifier for this box. + offset : int + Start position of box in bytes. + length : int + Length of the box in bytes. + + Returns: + kwargs: dictionary of parameter values + """ + kwargs = {} + kwargs['id'] = id + kwargs['length'] = length + kwargs['offset'] = offset + + buffer = f.read(16) + kwargs['uuid'] = uuid.UUID(bytes=buffer) + + n = offset + length - f.tell() + buffer = f.read(n) + kwargs['data'] = buffer + box = UUIDBox(**kwargs) + return box + + +# Map each box ID to the corresponding class. +_box_with_id = { + 'asoc': AssociationBox, + 'cdef': ComponentDefinitionBox, + 'cmap': ComponentMappingBox, + 'colr': ColourSpecificationBox, + 'jP ': JPEG2000SignatureBox, + 'ftyp': FileTypeBox, + 'ihdr': ImageHeaderBox, + 'jp2h': JP2HeaderBox, + 'jp2c': ContiguousCodestreamBox, + 'lbl ': LabelBox, + 'pclr': PaletteBox, + 'res ': ResolutionBox, + 'resc': CaptureResolutionBox, + 'resd': DisplayResolutionBox, + 'rreq': ReaderRequirementsBox, + 'uinf': UUIDInfoBox, + 'ulst': UUIDListBox, + 'url ': DataEntryURLBox, + 'uuid': UUIDBox, + 'xml ': XMLBox} diff --git a/glymur/jp2dump.py b/glymur/jp2dump.py new file mode 100644 index 0000000..0e751e2 --- /dev/null +++ b/glymur/jp2dump.py @@ -0,0 +1,22 @@ +""" +Entry point for jp2dump script. +""" + +from .jp2k import Jp2k + + +def jp2dump(filename, codestream=False): + """Prints JPEG2000 metadata. + + Parameters + ---------- + filename : string + The input JPEG2000 file. + codestream : optional, logical scalar + Whether or not to dump codestream contents. + """ + j = Jp2k(filename) + if codestream: + print(j.get_codestream(header_only=False)) + else: + print(j) diff --git a/glymur/jp2k.py b/glymur/jp2k.py new file mode 100644 index 0000000..cbd8be5 --- /dev/null +++ b/glymur/jp2k.py @@ -0,0 +1,671 @@ +"""Access to JPEG2000 files. + +License: MIT +""" +import sys +if sys.hexversion >= 0x03030000: + from contextlib import ExitStack +else: + from contextlib2 import ExitStack +import ctypes +import os +import struct +import warnings + +import numpy as np + +from .codestream import Codestream +from .core import progression_order +from .jp2box import Jp2kBox +from .lib import openjp2 as opj2 + +_cspace_map = {'rgb': opj2._CLRSPC_SRGB, + 'gray': opj2._CLRSPC_GRAY, + 'grey': opj2._CLRSPC_GRAY, + 'ycc': opj2._CLRSPC_YCC} + +# Setup the default callback handlers. See the callback functions subsection +# in the ctypes section of the Python documentation for a solid explanation of +# what's going on here. +_CMPFUNC = ctypes.CFUNCTYPE(ctypes.c_void_p, ctypes.c_char_p, ctypes.c_void_p) + + +def _default_error_handler(msg, client_data): + msg = "OpenJPEG library error: {0}".format(msg.decode('utf-8').rstrip()) + opj2._set_error_message(msg) + + +def _default_info_handler(msg, client_data): + print("[INFO] {0}".format(msg.decode('utf-8').rstrip())) + + +def _default_warning_handler(library_msg, client_data): + library_msg = library_msg.decode('utf-8').rstrip() + msg = "OpenJPEG library warning: {0}".format(library_msg) + warnings.warn(msg) + +_error_callback = _CMPFUNC(_default_error_handler) +_info_callback = _CMPFUNC(_default_info_handler) +_warning_callback = _CMPFUNC(_default_warning_handler) + + +class Jp2k(Jp2kBox): + """JPEG 2000 file. + + Attributes + ---------- + filename : str + The path to the JPEG 2000 file. + mode : str + The mode used to open the file. + box : sequence + List of top-level boxes in the file. Each box may in turn contain + its own list of boxes. Will be empty if the file consists only of a + raw codestream. + """ + + def __init__(self, filename, mode='rb'): + """ + Parameters + ---------- + filename : str or file + The path to JPEG 2000 file. + mode : str, optional + The mode used to open the file. + """ + self.filename = filename + self.mode = mode + self.box = [] + self.offset = 0 + + # Parse the file for JP2/JPX contents only if we are reading it. + if mode == 'rb': + self._parse() + + def __str__(self): + metadata = ['File: ' + os.path.basename(self.filename)] + if len(self.box) > 0: + for box in self.box: + metadata.append(box.__str__()) + else: + c = self.get_codestream() + metadata.append(c.__str__()) + return '\n'.join(metadata) + + def _parse(self): + """Parses the JPEG 2000 file. + + Raises + ------ + IOError + The file was not JPEG 2000. + """ + stat = os.stat(self.filename) + self.length = stat.st_size + self._file_size = stat.st_size + + with open(self.filename, 'rb') as f: + + # Make sure we have a JPEG2000 file. It could be either JP2 or + # J2C. Check for J2C first, single box in that case. + buffer = f.read(2) + signature, = struct.unpack('>H', buffer) + if signature == 0xff4f: + self._codec_format = opj2._CODEC_J2K + # That's it, we're done. The codestream object is only + # produced upon explicit request. + return + + self._codec_format = opj2._CODEC_JP2 + + # Should be JP2. + # First 4 bytes should be 12, the length of the 'jP ' box. + # 2nd 4 bytes should be the box ID ('jP '). + # 3rd 4 bytes should be the box signature (13, 10, 135, 10). + f.seek(0) + buffer = f.read(12) + values = struct.unpack('>I4s4B', buffer) + L = values[0] + T = values[1] + signature = values[2:] + if L != 12 or T != b'jP ' or signature != (13, 10, 135, 10): + msg = '{0} is not a JPEG 2000 file.'.format(self.filename) + raise IOError(msg) + + # Back up and start again, we know we have a superbox (box of + # boxes) here. + f.seek(0) + self.box = self._parse_superbox(f) + + def write(self, data, cratios=None, eph=False, psnr=None, numres=None, + cbsize=None, psizes=None, grid_offset=None, sop=False, + subsam=None, tilesize=None, prog=None, modesw=None, + colorspace=None, verbose=False): + """Write image data to a JP2/JPX/J2k file. Intended usage of the + various parameters follows that of OpenJPEG's opj_compress utility. + + This method can only be used to create JPEG 2000 images that can fit + in memory. + + Parameters + ---------- + data : array + Image data to be written to file. + callbacks : bool, optional + If true, enable default info handler such that INFO messages + produced by the OpenJPEG library are output to the console. By + default, OpenJPEG warning and error messages are captured by + Python's own warning and error mechanisms. + cbsize : tuple, optional + Code block size (DY, DX). + colorspace : str, optional + Either 'rgb' or 'gray'. + cratios : sequence, optional + Compression ratios for successive layers. + eph : bool, optional + If true, write SOP marker after each header packet. + grid_offset : tuple, optional + Offset (DY, DX) of the origin of the image in the reference grid. + modesw : int, optional + Mode switch. + 1 = BYPASS(LAZY) + 2 = RESET + 4 = RESTART(TERMALL) + 8 = VSC + 16 = ERTERM(SEGTERM) + 32 = SEGMARK(SEGSYM) + numres : int, optional + Number of resolutions. + prog : str, optional + Progression order, one of "LRCP" "RLCP", "RPCL", "PCRL", "CPRL". + psnr : list, optional + Different PSNR for successive layers. + psizes : list, optional + List of precinct sizes. + sop : bool, optional + If true, write SOP marker before each packet. + subsam : tuple, optional + Subsampling factors (dy, dx). + tilesize : tuple, optional + Numeric tuple specifying tile size in terms of (numrows, numcols), + not (X, Y). + verbose : bool, optional + Print informational messages produced by the OpenJPEG library. + + Examples + -------- + >>> import numpy as np + >>> import matplotlib as mpl + >>> import matplotlib.pyplot as plt + >>> import os + >>> file = os.path.join(mpl.get_data_path(), 'sample_data', 'lena.png') + >>> data = plt.imread(file) + >>> data = data * 255 + >>> from tempfile import NamedTemporaryFile + >>> tfile = NamedTemporaryFile(suffix='.jp2', delete=False) + >>> from glymur import Jp2k + >>> j = Jp2k(tfile.name, mode='wb') + >>> j.write(data.astype(np.uint8)) + """ + + cparams = opj2._set_default_encoder_parameters() + + outfile = self.filename.encode() + n = opj2._PATH_LEN - len(outfile) + outfile += b'0' * n + cparams.outfile = outfile + + if self.filename[-4:].lower() == '.jp2': + codec_fmt = opj2._CODEC_JP2 + else: + codec_fmt = opj2._CODEC_J2K + + cparams.cod_format = codec_fmt + + # Set defaults to lossless to begin. + cparams.tcp_rates[0] = 0 + cparams.tcp_numlayers = 1 + cparams.cp_disto_alloc = 1 + + if cbsize is not None: + w = cbsize[1] + h = cbsize[0] + if h * w > 4096 or h < 4 or w < 4: + msg = "Code block area cannot exceed 4096. " + msg += "Code block height and width must be larger than 4." + raise RuntimeError(msg) + cparams.cblockw_init = w + cparams.cblockh_init = h + + if cratios is not None: + cparams.tcp_numlayers = len(cratios) + for j, cratio in enumerate(cratios): + cparams.tcp_rates[j] = cratio + cparams.cp_disto_alloc = 1 + + if eph: + cparams.csty |= 0x04 + + if grid_offset is not None: + cparams.image_offset_x0 = grid_offset[1] + cparams.image_offset_y0 = grid_offset[0] + + if modesw is not None: + for x in range(6): + if modesw & (1 << x): + cparams.mode |= (1 << x) + + if numres is not None: + cparams.numresolution = numres + + if prog is not None: + prog = prog.upper() + cparams.prog_order = progression_order[prog] + + if psnr is not None: + cparams.tcp_numlayers = len(psnr) + for j, snr_layer in enumerate(psnr): + cparams.tcp_distoratio[j] = snr_layer + cparams.cp_fixed_quality = 1 + + if psizes is not None: + for j, precinct in enumerate(psizes): + cparams.prcw_init[j] = precinct[0] + cparams.prch_init[j] = precinct[1] + cparams.csty |= 0x01 + cparams.res_spec = len(psizes) + + if sop: + cparams.csty |= 0x02 + + if subsam is not None: + cparams.subsampling_dy = subsam[0] + cparams.subsampling_dx = subsam[1] + + if tilesize is not None: + cparams.cp_tdx = tilesize[1] + cparams.cp_tdy = tilesize[0] + cparams.tile_size_on = opj2._TRUE + + if cratios is not None and psnr is not None: + msg = "Cannot specify cratios and psnr together." + raise RuntimeError(msg) + + if data.ndim == 2: + numrows, numcols = data.shape + data = data.reshape(numrows, numcols, 1) + elif data.ndim == 3: + pass + else: + msg = "{0}D imagery is not allowed.".format(data.ndim) + raise IOError(msg) + + numrows, numcols, num_comps = data.shape + + if colorspace is None: + if data.shape[2] == 1 or data.shape[2] == 2: + colorspace = opj2._CLRSPC_GRAY + else: + # No YCC unless specifically told to do so. + colorspace = opj2._CLRSPC_SRGB + else: + if codec_fmt == opj2._CODEC_J2K: + raise IOError('Do not specify a colorspace with J2K.') + colorspace = colorspace.lower() + if colorspace not in ('rgb', 'grey', 'gray'): + msg = 'Invalid colorspace "{0}"'.format(colorspace) + raise IOError(msg) + elif colorspace == 'rgb' and data.shape[2] < 3: + msg = 'RGB colorspace requires at least 3 components.' + raise IOError(msg) + else: + colorspace = _cspace_map[colorspace] + + if data.dtype == np.uint8: + comp_prec = 8 + elif data.dtype == np.uint16: + comp_prec = 16 + else: + raise RuntimeError("unhandled datatype") + + comptparms = (opj2._image_comptparm_t * num_comps)() + for j in range(num_comps): + comptparms[j].dx = cparams.subsampling_dx + comptparms[j].dy = cparams.subsampling_dy + comptparms[j].w = numcols + comptparms[j].h = numrows + comptparms[j].x0 = cparams.image_offset_x0 + comptparms[j].y0 = cparams.image_offset_y0 + comptparms[j].prec = comp_prec + comptparms[j].bpp = comp_prec + comptparms[j].sgnd = 0 + + image = opj2._image_create(comptparms, colorspace) + + # set image offset and reference grid + image.contents.x0 = cparams.image_offset_x0 + image.contents.y0 = cparams.image_offset_y0 + image.contents.x1 = (image.contents.x0 + + (numcols - 1) * cparams.subsampling_dx + 1) + image.contents.y1 = (image.contents.y0 + + (numrows - 1) * cparams.subsampling_dy + 1) + + # Stage the image data to the openjpeg data structure. + for k in range(0, num_comps): + layer = np.ascontiguousarray(data[:, :, k], dtype=np.int32) + dest = image.contents.comps[k].data + src = layer.ctypes.data + ctypes.memmove(dest, src, layer.nbytes) + + # set multi-component transform? + if image.contents.numcomps == 3: + cparams.tcp_mct = 1 + else: + cparams.tcp_mct = 0 + + codec = opj2._create_compress(codec_fmt) + + if verbose: + opj2._set_info_handler(codec, _info_callback) + else: + opj2._set_info_handler(codec, None) + + opj2._set_warning_handler(codec, _warning_callback) + opj2._set_error_handler(codec, _error_callback) + opj2._setup_encoder(codec, cparams, image) + strm = opj2._stream_create_default_file_stream_v3(self.filename, False) + opj2._start_compress(codec, image, strm) + opj2._encode(codec, strm) + opj2._end_compress(codec, strm) + opj2._stream_destroy_v3(strm) + opj2._destroy_codec(codec) + opj2._image_destroy(image) + + self._parse() + + def read(self, reduce=0, layer=0, area=None, tile=None, verbose=False): + """Read a JPEG 2000 image. + + Parameters + ---------- + layer : int, optional + Number of quality layer to decode. + reduce : int, optional + Factor by which to reduce output resolution. + area : tuple, optional + Specifies decoding image area, + (first_row, first_col, last_row, last_col) + tile : int, optional + Number of tile to decode. + verbose : bool, optional + Print informational messages produced by the OpenJPEG library. + + Returns + ------- + result : array + The image data. + + Raises + ------ + IOError + If the image has differing subsample factors. + + Examples + -------- + >>> import glymur + >>> import pkg_resources as pkg + >>> jfile = pkg.resource_filename(glymur.__name__, "data/nemo.jp2") + >>> jp = glymur.Jp2k(jfile) + >>> data = jp.read(reduce=1) + """ + # Check for differing subsample factors. + codestream = self.get_codestream(header_only=True) + dxs = np.array(codestream.segment[1].XRsiz) + dys = np.array(codestream.segment[1].YRsiz) + if np.any(dxs - dxs[0]) or np.any(dys - dys[0]): + msg = "Components must all have the same subsampling factors." + raise IOError(msg) + + data = self._read_common(reduce=reduce, + layer=layer, + area=area, + tile=tile, + verbose=verbose, + as_bands=False) + + if data.shape[2] == 1: + data = data.view() + data.shape = data.shape[0:2] + + return data + + def _read_common(self, reduce=0, layer=0, area=None, tile=None, + verbose=False, as_bands=False): + """Read a JPEG 2000 image. + + Parameters + ---------- + layer : int, optional + Number of quality layer to decode. + reduce : int, optional + Factor by which to reduce output resolution. + area : tuple, optional + Specifies decoding image area, + (first_row, first_col, last_row, last_col) + tile : int, optional + Number of tile to decode. + verbose : bool, optional + Print informational messages produced by the OpenJPEG library. + as_bands : bool, optional + If true, return the individual 2D components in a list. + + Returns + ------- + data : list or array + The individual image components or a single array. + """ + dparam = opj2._set_default_decoder_parameters() + + infile = self.filename.encode() + nelts = opj2._PATH_LEN - len(infile) + infile += b'0' * nelts + dparam.infile = infile + + dparam.decod_format = self._codec_format + + dparam.cp_layer = layer + dparam.cp_reduce = reduce + if area is not None: + if area[0] < 0 or area[1] < 0: + msg = "Upper left corner coordinates must be nonnegative: {0}" + msg = msg.format(area) + raise IOError(msg) + if area[2] <= 0 or area[3] <= 0: + msg = "Lower right corner coordinates must be positive: {0}" + msg = msg.format(area) + raise IOError(msg) + dparam.DA_y0 = area[0] + dparam.DA_x0 = area[1] + dparam.DA_y1 = area[2] + dparam.DA_x1 = area[3] + + if tile is not None: + dparam.tile_index = tile + dparam.nb_tile_to_decode = 1 + + with ExitStack() as stack: + stream = opj2._stream_create_default_file_stream_v3(self.filename, + True) + stack.callback(opj2._stream_destroy_v3, stream) + codec = opj2._create_decompress(self._codec_format) + stack.callback(opj2._destroy_codec, codec) + + opj2._set_error_handler(codec, _error_callback) + opj2._set_warning_handler(codec, _warning_callback) + if verbose: + opj2._set_info_handler(codec, _info_callback) + else: + opj2._set_info_handler(codec, None) + + opj2._setup_decoder(codec, dparam) + image = opj2._read_header(stream, codec) + stack.callback(opj2._image_destroy, image) + + if dparam.nb_tile_to_decode: + opj2._get_decoded_tile(codec, stream, image, dparam.tile_index) + else: + opj2._set_decode_area(codec, image, + dparam.DA_x0, dparam.DA_y0, + dparam.DA_x1, dparam.DA_y1) + opj2._decode(codec, stream, image) + opj2._end_decompress(codec, stream) + + component = image.contents.comps[0] + if component.sgnd: + if component.prec <= 8: + dtype = np.int8 + elif component.prec <= 16: + dtype = np.int16 + else: + raise RuntimeError("Unhandled precision, datatype") + else: + if component.prec <= 8: + dtype = np.uint8 + elif component.prec <= 16: + dtype = np.uint16 + else: + raise RuntimeError("Unhandled precision, datatype") + + if as_bands: + data = [] + else: + nrows = image.contents.comps[0].h + ncols = image.contents.comps[0].w + ncomps = image.contents.numcomps + data = np.zeros((nrows, ncols, ncomps), dtype) + + for k in range(image.contents.numcomps): + component = image.contents.comps[k] + nrows = component.h + ncols = component.w + + if nrows == 0 or ncols == 0: + # Letting this situation continue would segfault + # Python. + msg = "Component {0} has dimensions {1} x {2}" + msg = msg.format(k, nrows, ncols) + raise IOError(msg) + + addr = ctypes.addressof(component.data.contents) + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + x = np.ctypeslib.as_array( + (ctypes.c_int32 * nrows * ncols).from_address(addr)) + if as_bands: + data.append(np.reshape(x.astype(dtype), (nrows, ncols))) + else: + data[:, :, k] = np.reshape(x.astype(dtype), (nrows, ncols)) + + return data + + def read_bands(self, reduce=0, layer=0, area=None, tile=None, + verbose=False): + """Read a JPEG 2000 image. + + The only time you should use this method is when the image has + different subsampling factors across components. Otherwise you should + use the read method. + + Parameters + ---------- + layer : int, optional + Number of quality layer to decode. + reduce : int, optional + Factor by which to reduce output resolution. + area : tuple, optional + Specifies decoding image area, + (first_row, first_col, last_row, last_col) + tile : int, optional + Number of tile to decode. + verbose : bool, optional + Print informational messages produced by the OpenJPEG library. + + Returns + ------- + lst : list + The individual image components. + + See also + -------- + read : read JPEG 2000 image + + Examples + -------- + >>> import glymur + >>> import pkg_resources as pkg + >>> jfile = pkg.resource_filename(glymur.__name__, "data/nemo.jp2") + >>> jp = glymur.Jp2k(jfile) + >>> components_lst = jp.read_bands(reduce=1) + """ + lst = self._read_common(reduce=reduce, + layer=layer, + area=area, + tile=tile, + verbose=verbose, + as_bands=True) + + return lst + + def get_codestream(self, header_only=True): + """Returns a codestream object. + + Parameters + ---------- + header_only : bool, optional + If True, only marker segments in the main header are parsed. + Supplying False may impose a large performance penalty. + + Returns + ------- + Object describing the codestream syntax. + + Examples + -------- + >>> import glymur + >>> import pkg_resources as pkg + >>> jfile = pkg.resource_filename(glymur.__name__, "data/nemo.jp2") + >>> jp = glymur.Jp2k(jfile) + >>> codestream = jp.get_codestream() + >>> print(codestream.segment[1]) + SIZ marker segment @ (87, 47) + Profile: 2 + Reference Grid Height, Width: (1456 x 2592) + Vertical, Horizontal Reference Grid Offset: (0 x 0) + Reference Tile Height, Width: (512 x 512) + Vertical, Horizontal Reference Tile Offset: (0 x 0) + Bitdepth: (8, 8, 8) + Signed: (False, False, False) + Vertical, Horizontal Subsampling: ((1, 1), (1, 1), (1, 1)) + + Raises + ------ + IOError + If the file is JPX with more than one codestream. + """ + with open(self.filename, 'rb') as fp: + if self._codec_format == opj2._CODEC_J2K: + codestream = Codestream(fp, header_only=header_only) + else: + box = [x for x in self.box if x.id == 'jp2c'] + if len(box) != 1: + msg = "JP2 files must have a single codestream." + raise RuntimeError(msg) + fp.seek(box[0].offset) + buffer = fp.read(8) + (L, T) = struct.unpack('>I4s', buffer) + if L == 1: + # Seek past the XL field. + buffer = fp.read(8) + codestream = Codestream(fp, header_only=header_only) + + return codestream diff --git a/glymur/lib/__init__.py b/glymur/lib/__init__.py new file mode 100644 index 0000000..ca7460c --- /dev/null +++ b/glymur/lib/__init__.py @@ -0,0 +1,3 @@ +"""This package organizes individual libraries employed by glymur.""" +from . import openjp2 +from . import test diff --git a/glymur/lib/openjp2.py b/glymur/lib/openjp2.py new file mode 100644 index 0000000..5ba07e6 --- /dev/null +++ b/glymur/lib/openjp2.py @@ -0,0 +1,1309 @@ +""" +Wraps individual functions in openjp2 library. +""" + +import ctypes + +import numpy as np + +from .. import _OPENJP2 +from ..core import LRCP, RLCP, RPCL, PCRL, CPRL + + +_ERROR_MSG_LST = [] + +# Map certain atomic OpenJPEG datatypes to the ctypes equivalents. +_bool_t = ctypes.c_int32 +_codec_t_p = ctypes.c_void_p +_prog_order_t_p = ctypes.c_int32 +_cinema_mode_t = ctypes.c_int32 +_rsiz_capabilities_t = ctypes.c_int32 +_stream_t_p = ctypes.c_void_p + +_PATH_LEN = 4096 +_J2K_MAXRLVLS = 33 +_J2K_MAXBANDS = (3 * _J2K_MAXRLVLS - 2) + +_JPWL_MAX_NO_TILESPECS = 16 + +_TRUE = 1 +_FALSE = 0 + +# supported color spaces +_CLRSPC_UNKNOWN = -1 +_CLRSPC_UNSPECIFIED = 0 +_CLRSPC_SRGB = 1 +_CLRSPC_GRAY = 2 +_CLRSPC_YCC = 3 +color_space_t = ctypes.c_int + +# supported codec +_codec_format_t = ctypes.c_int +_CODEC_UNKNOWN = -1 +_CODEC_J2K = 0 +_CODEC_JPT = 1 +_CODEC_JP2 = 2 + + +class _poc_t(ctypes.Structure): + """Progression order changes.""" + # Resolution num start, Component num start, given by POC + _fields_ = [ + ("resno0", ctypes.c_uint32), + ("compno0", ctypes.c_uint32), + + # Layer num end,Resolution num end, Component num end, given by POC + ("layno1", ctypes.c_uint32), + ("resno1", ctypes.c_uint32), + ("compno1", ctypes.c_uint32), + + # Layer num start,Precinct num start, Precinct num end + ("layno0", ctypes.c_uint32), + ("precno0", ctypes.c_uint32), + ("precno1", ctypes.c_uint32), + + # Progression order enum + ("prg1", _prog_order_t_p), + ("prg", _prog_order_t_p), + + # Progression order string + ("progorder", ctypes.c_char * 5), + + # Tile number + ("tile", ctypes.c_uint32), + + # Start and end values for Tile width and height* + ("tx0", ctypes.c_int32), + ("tx1", ctypes.c_int32), + ("ty0", ctypes.c_int32), + ("ty1", ctypes.c_int32), + + # Start value, initialised in pi_initialise_encode + ("layS", ctypes.c_uint32), + ("resS", ctypes.c_uint32), + ("compS", ctypes.c_uint32), + ("prcS", ctypes.c_uint32), + + # End value, initialised in pi_initialise_encode + ("layE", ctypes.c_uint32), + ("resE", ctypes.c_uint32), + ("compE", ctypes.c_uint32), + ("prcE", ctypes.c_uint32), + + # Start and end values of Tile width and height, initialised in + # pi_initialise_encode + ("txS", ctypes.c_uint32), + ("txE", ctypes.c_uint32), + ("tyS", ctypes.c_uint32), + ("tyE", ctypes.c_uint32), + ("dx", ctypes.c_uint32), + ("dy", ctypes.c_uint32), + + # Temporary values for Tile parts, initialised in pi_create_encode + ("lay_t", ctypes.c_uint32), + ("res_t", ctypes.c_uint32), + ("comp_t", ctypes.c_uint32), + ("prec_t", ctypes.c_uint32), + ("tx0_t", ctypes.c_uint32), + ("ty0_t", ctypes.c_uint32)] + + +class _dparameters_t(ctypes.Structure): + """Decompression parameters""" + _fields_ = [ + # Set the number of highest resolutio levels to be discarded. The + # image resolution is effectively divided by 2 to the power of + # discarded levels. The reduce factor is limited by the smallest + # total number of decomposition levels among tiles. If not equal to + # zero, then the original dimension is divided by 2^(reduce). If + # equal to zero or not used, the image is decoded to the full + # resolution. + ("cp_reduce", ctypes.c_uint32), + + # Set the maximum number of quality layers to decode. If there are + # fewer quality layers than the specified number, all the quality + # layers are decoded. + # + # If != 0, then only the first cp_layer layers are decoded. + # If == 0 or not used, all the quality layers are decoded. + ("cp_layer", ctypes.c_uint32), + + # input file name + ("infile", ctypes.c_char * _PATH_LEN), + + # output file name + ("outfile", ctypes.c_char * _PATH_LEN), + + # input file format 0: PGX, 1: PxM, 2: BMP 3:TIF + # output file format 0: J2K, 1: JP2, 2: JPT + ("decod_format", ctypes.c_int), + ("cod_format", ctypes.c_int), + + # Decoding area left and right boundary. + # Decoding area upper and lower boundary. + ("DA_x0", ctypes.c_uint32), + ("DA_x1", ctypes.c_uint32), + ("DA_y0", ctypes.c_uint32), + ("DA_y1", ctypes.c_uint32), + + # verbose mode + ("m_verbose", _bool_t), + + # tile number of the decoded tile + ("tile_index", ctypes.c_uint32), + + # number of tiles to decode + ("nb_tile_to_decode", ctypes.c_uint32), + + # activates the JPWL correction capabilities + ("jpwl_correct", _bool_t), + + # activates the JPWL correction capabilities + ("jpwl_exp_comps", ctypes.c_int32), + + # maximum number of tiles + ("jpwl_max_tiles", ctypes.c_int32), + + # maximum number of tiles + ("flags", ctypes.c_uint32)] + + +class _cparameters_t(ctypes.Structure): + """Compression parameters""" + _fields_ = [ + # size of tile: + # tile_size_on = false (not in argument) or + # = true (in argument) + ("tile_size_on", _bool_t), + + # XTOsiz, YTOsiz + ("cp_tx0", ctypes.c_int), + ("cp_ty0", ctypes.c_int), + + # XTsiz, YTsiz + ("cp_tdx", ctypes.c_int), + ("cp_tdy", ctypes.c_int), + + # allocation by rate/distortion + ("cp_disto_alloc", ctypes.c_int), + + # allocation by fixed layer + ("cp_fixed_alloc", ctypes.c_int), + + # add fixed_quality + ("cp_fixed_quality", ctypes.c_int), + + # fixed layer + ("cp_matrice", ctypes.c_void_p), + + # comment for coding + ("cp_comment", ctypes.c_char_p), + + # csty : coding style + ("csty", ctypes.c_int), + + # progression order (default OPJ_LRCP) + ("prog_order", ctypes.c_int), + + # progression order changes + ("poc", _poc_t * 32), + + # number of progression order changes (POC), default to 0 + ("numpocs", ctypes.c_uint), + + # number of layers + ("tcp_numlayers", ctypes.c_int), + + # rates of layers + ("tcp_rates", ctypes.c_float * 100), + + # different psnr for successive layers + ("tcp_distoratio", ctypes.c_float * 100), + + # number of resolutions + ("numresolution", ctypes.c_int), + + # initial code block width, default to 64 + ("cblockw_init", ctypes.c_int), + + # initial code block height, default to 64 + ("cblockh_init", ctypes.c_int), + + # mode switch (cblk_style) + ("mode", ctypes.c_int), + + # 1 : use the irreversible DWT 9-7 + # 0 : use lossless compression (default) + ("irreversible", ctypes.c_int), + + # region of interest: affected component in [0..3], -1 means no ROI + ("roi_compno", ctypes.c_int), + + # region of interest: upshift value + ("roi_shift", ctypes.c_int), + + # number of precinct size specifications + ("res_spec", ctypes.c_int), + + # initial precinct width + ("prcw_init", ctypes.c_int * _J2K_MAXRLVLS), + + # initial precinct height + ("prch_init", ctypes.c_int * _J2K_MAXRLVLS), + + # input file name + ("infile", ctypes.c_char * _PATH_LEN), + + # output file name + ("outfile", ctypes.c_char * _PATH_LEN), + + # DEPRECATED. + ("index_on", ctypes.c_int), + + # DEPRECATED. + ("index", ctypes.c_char * _PATH_LEN), + + # subimage encoding: origin image offset in x direction + # subimage encoding: origin image offset in y direction + ("image_offset_x0", ctypes.c_int), + ("image_offset_y0", ctypes.c_int), + + # subsampling value for dx + # subsampling value for dy + ("subsampling_dx", ctypes.c_int), + ("subsampling_dy", ctypes.c_int), + + # input file format 0: PGX, 1: PxM, 2: BMP 3:TIF + # output file format 0: J2K, 1: JP2, 2: JPT + ("decod_format", ctypes.c_int), + ("cod_format", ctypes.c_int), + + # JPWL encoding parameters + # enables writing of EPC in MH, thus activating JPWL + ("jpwl_epc_on", _bool_t), + + # error protection method for MH (0,1,16,32,37-128) + ("jpwl_hprot_mh", ctypes.c_int), + + # tile number of header protection specification (>=0) + ("jpwl_hprot_tph_tileno", ctypes.c_int * _JPWL_MAX_NO_TILESPECS), + + # error protection methods for TPHs (0,1,16,32,37-128) + ("jpwl_hprot_tph", ctypes.c_int * _JPWL_MAX_NO_TILESPECS), + + # tile number of packet protection specification (>=0) + ("jpwl_pprot_tileno", ctypes.c_int * _JPWL_MAX_NO_TILESPECS), + + # packet number of packet protection specification (>=0) + ("jpwl_pprot_packno", ctypes.c_int * _JPWL_MAX_NO_TILESPECS), + + # error protection methods for packets (0,1,16,32,37-128) + ("jpwl_pprot", ctypes.c_int * _JPWL_MAX_NO_TILESPECS), + + # enables writing of ESD, (0=no/1/2 bytes) + ("jpwl_sens_size", ctypes.c_int), + + # sensitivity addressing size (0=auto/2/4 bytes) + ("jpwl_sens_addr", ctypes.c_int), + + # sensitivity range (0-3) + ("jpwl_sens_range", ctypes.c_int), + + # sensitivity method for MH (-1=no,0-7) + ("jpwl_sens_mh", ctypes.c_int), + + # tile number of sensitivity specification (>=0) + ("jpwl_sens_tph_tileno", ctypes.c_int * _JPWL_MAX_NO_TILESPECS), + + # sensitivity methods for TPHs (-1=no,0-7) + ("jpwl_sens_tph", ctypes.c_int * _JPWL_MAX_NO_TILESPECS), + + # Digital Cinema compliance 0-not compliant, 1-compliant + ("cp_cinema", _cinema_mode_t), + + # Maximum rate for each component. + # If == 0, component size limitation is not considered + ("max_comp_size", ctypes.c_int), + + # Profile name + ("cp_rsiz", _rsiz_capabilities_t), + + # Tile part generation + ("tp_on", ctypes.c_uint8), + + # Flag for Tile part generation + ("tp_flag", ctypes.c_uint8), + + # MCT (multiple component transform) + ("tcp_mct", ctypes.c_uint8), + + # Enable JPIP indexing + ("jpip_on", _bool_t), + + # Naive implementation of MCT restricted to a single reversible array + # based encoding without offset concerning all the components. + ("mct_data", ctypes.c_void_p)] + + +class _image_comp_t(ctypes.Structure): + """defines a single image component""" + _fields_ = [ + # XRsiz, YRsiz: horizontal, vertical separation of ith component with + # respect to the reference grid + ("dx", ctypes.c_uint32), + ("dy", ctypes.c_uint32), + + # data width and height + ("w", ctypes.c_uint32), + ("h", ctypes.c_uint32), + + # x, y component offset compared to the whole image + ("x0", ctypes.c_uint32), + ("y0", ctypes.c_uint32), + + # component depth in bits + ("prec", ctypes.c_uint32), + + # component depth in bits + ("bpp", ctypes.c_uint32), + + # signed (1) or unsigned (0) + ("sgnd", ctypes.c_uint32), + + # number of decoded resolution + ("resno_decoded", ctypes.c_uint32), + + # number of division by 2 of the out image component as compared to the + # original size of the image + ("factor", ctypes.c_uint32), + + # image component data + ("data", ctypes.POINTER(ctypes.c_int32))] + + +class _image_t(ctypes.Structure): + """defines image data and characteristics""" + _fields_ = [ + # XOsiz, YOsiz: horizontal and vertical offset from the origin of the + # reference grid to the left side of the image area + ("x0", ctypes.c_uint32), + ("y0", ctypes.c_uint32), + + # Xsiz, Ysiz: width and height of the reference grid. + ("x1", ctypes.c_uint32), + ("y1", ctypes.c_uint32), + + # number of components in the image + ("numcomps", ctypes.c_uint32), + + # color space: should be sRGB, greyscale, or YUV + ("color_space", color_space_t), + + # image components + ("comps", ctypes.POINTER(_image_comp_t)), + + # restricted ICC profile buffer + ("icc_profile_buf", ctypes.POINTER(ctypes.c_uint8)), + + # restricted ICC profile buffer length + ("icc_profile_len", ctypes.c_uint32)] + + +class _image_comptparm_t(ctypes.Structure): + """component parameters structure used by image_create function""" + _fields_ = [ + # XRsiz, YRsiz: horizontal, vertical separation of a sample of ith + # component with respect to the reference grid + ("dx", ctypes.c_uint32), + ("dy", ctypes.c_uint32), + + # data width, height + ("w", ctypes.c_uint32), + ("h", ctypes.c_uint32), + + # x, y component offset compared to the whole image + ("x0", ctypes.c_uint32), + ("y0", ctypes.c_uint32), + + # precision + ("prec", ctypes.c_uint32), + + # image depth in bits + ("bpp", ctypes.c_uint32), + + # signed (1) / unsigned (0) + ("sgnd", ctypes.c_uint32)] + + +class _tccp_info_t(ctypes.Structure): + """tile-component coding parameters information""" + _fields_ = [ + # component index + ("compno", ctypes.c_uint32), + + # coding style + ("csty", ctypes.c_uint32), + + # number of resolutions + ("numresolutions", ctypes.c_uint32), + + # code-blocks width + ("cblkw", ctypes.c_uint32), + + # code-blocks height + ("cblkh", ctypes.c_uint32), + + # code-block coding style + ("cblksty", ctypes.c_uint32), + + # discrete wavelet transform identifier + ("qmfbid", ctypes.c_uint32), + + # quantization style + ("qntsty", ctypes.c_uint32), + + # stepsizes used for quantization + ("stepsizes_mant", ctypes.c_uint32 * _J2K_MAXBANDS), + ("stepsizes_expn", ctypes.c_uint32 * _J2K_MAXBANDS), + + # stepsizes used for quantization + ("numgbits", ctypes.c_uint32), + + # region of interest shift + ("roishift", ctypes.c_int32), + + # precinct width + ("prcw", ctypes.c_uint32 * _J2K_MAXRLVLS), + + # precinct width + ("prch", ctypes.c_uint32 * _J2K_MAXRLVLS)] + + +class _tile_info_v2_t(ctypes.Structure): + """tile coding parameters information""" + _fields_ = [ + # number (index) of tile + ("tileno", ctypes.c_int32), + + # coding style + ("csty", ctypes.c_uint32), + + # progression order + ("prg", _prog_order_t_p), + + # number of layers + ("numlayers", ctypes.c_uint32), + + # multi-component transform identifier + ("mct", ctypes.c_uint32), + + # information concerning tile component parameters + ("tccp_info", ctypes.POINTER(_tccp_info_t))] + + +class _codestream_info_v2_t(ctypes.Structure): + """information about the codestream""" + _fields_ = [ + # tile info + # tile origin in x, y (XTOsiz, YTOsiz) + ("tx0", ctypes.c_uint32), + ("ty0", ctypes.c_uint32), + + # tile size in x, y = XTsiz, YTsiz + ("tdx", ctypes.c_uint32), + ("tdy", ctypes.c_uint32), + + # number of tiles in X, Y + ("tw", ctypes.c_uint32), + ("th", ctypes.c_uint32), + + # number of components + ("nbcomps", ctypes.c_uint32), + + # default information regarding tiles inside of image + ("m_default_tile_info", _tile_info_v2_t), + + # information regarding tiles inside of image + ("tile_info", ctypes.POINTER(_tile_info_v2_t))] + +# Restrict the input and output argument types for each function used in the +# API. +_OPENJP2.opj_create_compress.argtypes = [_codec_format_t] +_OPENJP2.opj_create_compress.restype = _codec_t_p + +_OPENJP2.opj_create_decompress.argtypes = [_codec_format_t] +_OPENJP2.opj_create_decompress.restype = _codec_t_p + +_argtypes = [_codec_t_p, _stream_t_p, ctypes.POINTER(_image_t)] +_OPENJP2.opj_decode.argtypes = _argtypes + +_argtypes = [_codec_t_p, ctypes.c_uint32, + ctypes.POINTER(ctypes.c_uint8), + ctypes.c_uint32, + _stream_t_p] +_OPENJP2.opj_decode_tile_data.argtypes = _argtypes + +_argtypes = [ctypes.POINTER(ctypes.POINTER(_codestream_info_v2_t))] +_OPENJP2.opj_destroy_cstr_info.argtypes = _argtypes +_OPENJP2.opj_destroy_cstr_info.restype = ctypes.c_void_p + +_argtypes = [_codec_t_p, _stream_t_p] +_OPENJP2.opj_encode.argtypes = _argtypes + +_OPENJP2.opj_get_cstr_info.argtypes = [_codec_t_p] +_OPENJP2.opj_get_cstr_info.restype = ctypes.POINTER(_codestream_info_v2_t) + +_argtypes = [_codec_t_p, + _stream_t_p, + ctypes.POINTER(_image_t), + ctypes.c_uint32] +_OPENJP2.opj_get_decoded_tile.argtypes = _argtypes + +_argtypes = [ctypes.c_uint32, + ctypes.POINTER(_image_comptparm_t), + color_space_t] +_OPENJP2.opj_image_create.argtypes = _argtypes +_OPENJP2.opj_image_create.restype = ctypes.POINTER(_image_t) + +_argtypes = [ctypes.c_uint32, + ctypes.POINTER(_image_comptparm_t), + color_space_t] +_OPENJP2.opj_image_tile_create.argtypes = _argtypes +_OPENJP2.opj_image_tile_create.restype = ctypes.POINTER(_image_t) + +_OPENJP2.opj_image_destroy.argtypes = [ctypes.POINTER(_image_t)] + +_argtypes = [_stream_t_p, _codec_t_p, ctypes.POINTER(ctypes.POINTER(_image_t))] +_OPENJP2.opj_read_header.argtypes = _argtypes + +_argtypes = [_codec_t_p, + _stream_t_p, + ctypes.POINTER(ctypes.c_uint32), ctypes.POINTER(ctypes.c_uint32), + ctypes.POINTER(ctypes.c_int32), ctypes.POINTER(ctypes.c_int32), + ctypes.POINTER(ctypes.c_int32), ctypes.POINTER(ctypes.c_int32), + ctypes.POINTER(ctypes.c_uint32), + ctypes.POINTER(_bool_t)] +_OPENJP2.opj_read_tile_header.argtypes = _argtypes + +_argtypes = [_codec_t_p, ctypes.POINTER(_image_t), ctypes.c_int32, + ctypes.c_int32, ctypes.c_int32, ctypes.c_int32] +_OPENJP2.opj_set_decode_area.argtypes = _argtypes + +_argtypes = [ctypes.POINTER(_cparameters_t)] +_OPENJP2.opj_set_default_encoder_parameters.argtypes = _argtypes + +_argtypes = [ctypes.POINTER(_dparameters_t)] +_OPENJP2.opj_set_default_decoder_parameters.argtypes = _argtypes + +_argtypes = [_codec_t_p, ctypes.c_void_p, ctypes.c_void_p] +_OPENJP2.opj_set_error_handler.argtypes = _argtypes +_OPENJP2.opj_set_info_handler.argtypes = _argtypes +_OPENJP2.opj_set_warning_handler.argtypes = _argtypes + +_argtypes = [_codec_t_p, ctypes.POINTER(_dparameters_t)] +_OPENJP2.opj_setup_decoder.argtypes = _argtypes + +_argtypes = [_codec_t_p, + ctypes.POINTER(_cparameters_t), + ctypes.POINTER(_image_t)] +_OPENJP2.opj_setup_encoder.argtypes = _argtypes + +_argtypes = [ctypes.c_char_p, ctypes.c_int32] +_OPENJP2.opj_stream_create_default_file_stream_v3.argtypes = _argtypes +_OPENJP2.opj_stream_create_default_file_stream_v3.restype = _stream_t_p + +_argtypes = [_codec_t_p, ctypes.POINTER(_image_t), _stream_t_p] +_OPENJP2.opj_start_compress.argtypes = _argtypes + +_OPENJP2.opj_end_compress.argtypes = [_codec_t_p, _stream_t_p] +_OPENJP2.opj_end_decompress.argtypes = [_codec_t_p, _stream_t_p] + +_OPENJP2.opj_stream_destroy_v3.argtypes = [_stream_t_p] +_OPENJP2.opj_destroy_codec.argtypes = [_codec_t_p] + +_argtypes = [_codec_t_p, + ctypes.c_uint32, + ctypes.POINTER(ctypes.c_uint8), + ctypes.c_uint32, + _stream_t_p] +_OPENJP2.opj_write_tile.argtypes = _argtypes + + +def _check_error(status): + """Set a generic function as the restype attribute of all OpenJPEG + functions that return a _bool_t value. This way we do not have to check + for error status in each wrapping function and an exception will always be + appropriately raised. + """ + global _ERROR_MSG_LST + if status != 1: + if len(_ERROR_MSG_LST) > 0: + # clear out the existing error message so that we don't pick up + # a bad one next time around. + msg = '\n'.join(_ERROR_MSG_LST) + _ERROR_MSG_LST = [] + raise IOError(msg) + else: + raise IOError("OpenJPEG function failure.") + +# These library functions all return an error status. Circumvent that and +# force # them to raise an exception. +_fcns = ['opj_decode', 'opj_decode_tile_data', 'opj_end_compress', + 'opj_encode', 'opj_end_decompress', 'opj_get_decoded_tile', + 'opj_read_header', 'opj_read_tile_header', 'opj_set_decode_area', + 'opj_set_error_handler', 'opj_set_info_handler', + 'opj_set_warning_handler', + 'opj_setup_decoder', 'opj_setup_encoder', 'opj_start_compress', + 'opj_write_tile'] +for _fcn in _fcns: + _attr = getattr(_OPENJP2, _fcn) + setattr(_attr, 'restype', _check_error) + + +def _create_compress(codec_format): + """Creates a J2K/JP2 compress structure. + + Wraps the openjp2 library function opj_create_compress. + + Parameters + ---------- + codec_format : int + Specifies codec to select. Should be one of _CODEC_J2K or _CODEC_JP2. + + Returns + ------- + codec : Reference to _codec_t_p instance. + """ + codec = _OPENJP2.opj_create_compress(codec_format) + return codec + + +def _decode(codec, stream, image): + """Reads an entire image. + + Wraps the openjp2 library function opj_decode. + + Parameters + ---------- + codec : _codec_t_p + The JPEG2000 codec + stream : _stream_t_p + The stream to decode. + image : _image_t + Output image structure. + + Raises + ------ + RuntimeError + If the OpenJPEG library routine opj_decode fails. + """ + _OPENJP2.opj_decode(codec, stream, image) + + +def _decode_tile_data(codec, tidx, data, data_size, stream): + """Reads tile data. + + Wraps the openjp2 library function opj_decode_tile_data. + + Parameters + ---------- + codec : _codec_t_p + The JPEG2000 codec + tile_index : int + The index of the tile being decoded + data : array + Holds a memory block into which data will be decoded. + data_size : int + The size of data in bytes + stream : _stream_t_p + The stream to decode. + + Raises + ------ + RuntimeError + If the OpenJPEG library routine opj_decode fails. + """ + datap = data.ctypes.data_as(ctypes.POINTER(ctypes.c_uint8)) + _OPENJP2.opj_decode_tile_data(codec, + ctypes.c_uint32(tidx), + datap, + ctypes.c_uint32(data_size), + stream) + return codec + + +def _create_decompress(codec_format): + """Creates a J2K/JP2 decompress structure. + + Wraps the openjp2 library function opj_create_decompress. + + Parameters + ---------- + codec_format : int + Specifies codec to select. Should be one of _CODEC_J2K or _CODEC_JP2. + + Returns + ------- + codec : Reference to _codec_t_p instance. + """ + codec = _OPENJP2.opj_create_decompress(codec_format) + return codec + + +def _destroy_codec(codec): + """Destroy a decompressor handle. + + Wraps the openjp2 library function opj_destroy_codec. + + Parameters + ---------- + codec : _codec_t_p + Decompressor handle to destroy. + """ + _OPENJP2.opj_destroy_codec(codec) + + +def _encode(codec, stream): + """Wraps openjp2 library function opj_encode. + + Encode an image into a JPEG 2000 codestream. + + Parameters + ---------- + codec : _codec_t_p + The jpeg2000 codec. + stream : _stream_t_p + The stream to which data is written. + + Raises + ------ + RuntimeError + If the OpenJPEG library routine opj_encode fails. + """ + _OPENJP2.opj_encode(codec, stream) + + +def _get_cstr_info(codec): + """get the codestream information from the codec + + Wraps the openjp2 library function opj_get_cstr_info. + + Parameters + ---------- + codec : _codec_t_p + The jpeg2000 codec. + + Returns + ------- + cstr_info_p : _codestream_info_v2_t + Reference to codestream information. + """ + cstr_info_p = _OPENJP2.opj_get_cstr_info(codec) + return cstr_info_p + + +def _get_decoded_tile(codec, stream, imagep, tile_index): + """get the decoded tile from the codec + + Wraps the openjp2 library function opj_get_decoded_tile. + + Parameters + ---------- + codec : _codec_t_p + The jpeg2000 codec. + stream : _stream_t_p + The input stream. + image : _image_t + Output image structure. + tiler_index : int + Index of the tile which will be decoded. + + Raises + ------ + RuntimeError + If the OpenJPEG library routine opj_get_decoded_tile fails. + """ + _OPENJP2.opj_get_decoded_tile(codec, stream, imagep, tile_index) + + +def _destroy_cstr_info(cstr_info_p): + """destroy codestream information after compression or decompression + + Wraps the openjp2 library function opj_destroy_cstr_info. + + Parameters + ---------- + cstr_info_p : _codestream_info_v2_t pointer + Pointer to codestream info structure. + """ + _OPENJP2.opj_destroy_cstr_info(ctypes.byref(cstr_info_p)) + + +def _end_compress(codec, stream): + """End of compressing the current image. + + Wraps the openjp2 library function opj_end_compress. + + Parameters + ---------- + codec : _codec_t_p + Compressor handle. + stream : _stream_t_p + Output stream buffer. + + Raises + ------ + RuntimeError + If the OpenJPEG library routine opj_end_compress fails. + """ + _OPENJP2.opj_end_compress(codec, stream) + + +def _end_decompress(codec, stream): + """End of decompressing the current image. + + Wraps the openjp2 library function opj_end_decompress. + + Parameters + ---------- + codec : _codec_t_p + Compressor handle. + stream : _stream_t_p + Output stream buffer. + + Raises + ------ + RuntimeError + If the OpenJPEG library routine opj_end_decompress fails. + """ + _OPENJP2.opj_end_decompress(codec, stream) + + +def _image_destroy(image): + """Deallocate any resources associated with an image. + + Wraps the openjp2 library function opj_image_destroy. + + Parameters + ---------- + image : _image_t pointer + Image resource to be disposed. + """ + _OPENJP2.opj_image_destroy(image) + + +def _image_create(comptparms, clrspc): + """Creates a new image structure. + + Wraps the openjp2 library function opj_image_create. + + Parameters + ---------- + cmptparms : comptparms_t + The component parameters. + clrspc : int + Specifies the color space. + + Returns + ------- + image : _image_t + Reference to _image_t instance. + """ + image = _OPENJP2.opj_image_create(len(comptparms), + comptparms, + clrspc) + return image + + +def _image_tile_create(comptparms, clrspc): + """Creates a new image structure. + + Wraps the openjp2 library function opj_image_tile_create. + + Parameters + ---------- + cmptparms : comptparms_t + The component parameters. + clrspc : int + Specifies the color space. + + Returns + ------- + image : _image_t + Reference to _image_t instance. + """ + image = _OPENJP2.opj_image_tile_create(len(comptparms), + comptparms, + clrspc) + return image + + +def _read_header(stream, codec): + """Decodes an image header. + + Wraps the openjp2 library function opj_read_header. + + Parameters + ---------- + stream: _stream_t_p + The JPEG2000 stream. + codec: codec_t + The JPEG2000 codec to read. + + Returns + ------- + imagep : reference to _image_t instance + The image structure initialized with image characteristics. + + Raises + ------ + RuntimeError + If the OpenJPEG library routine opj_read_header fails. + """ + imagep = ctypes.POINTER(_image_t)() + _OPENJP2.opj_read_header(stream, codec, ctypes.byref(imagep)) + return imagep + + +def _read_tile_header(codec, stream): + """Reads a tile header. + + Wraps the openjp2 library function opj_read_tile_header. + + Parameters + ---------- + codec : codec_t + The JPEG2000 codec to read. + stream : _stream_t_p + The JPEG2000 stream. + + Returns + ------- + tile_index : int + index of the tile being decoded + data_size : int + number of bytes for the decoded area + x0, y0 : int + upper left-most coordinate of tile + x1, y1 : int + lower right-most coordinate of tile + ncomps : int + number of components in the tile + go_on : bool + indicates that decoding should continue + + Raises + ------ + RuntimeError + If the OpenJPEG library routine opj_read_tile_header fails. + """ + tile_index = ctypes.c_uint32() + data_size = ctypes.c_uint32() + x0 = ctypes.c_int32() + y0 = ctypes.c_int32() + x1 = ctypes.c_int32() + y1 = ctypes.c_int32() + ncomps = ctypes.c_uint32() + go_on = _bool_t() + _OPENJP2.opj_read_tile_header(codec, + stream, + ctypes.byref(tile_index), + ctypes.byref(data_size), + ctypes.byref(x0), + ctypes.byref(y0), + ctypes.byref(x1), + ctypes.byref(y1), + ctypes.byref(ncomps), + ctypes.byref(go_on)) + go_on = bool(go_on.value) + return (tile_index.value, + data_size.value, + x0.value, + y0.value, + x1.value, + y1.value, + ncomps.value, + go_on) + + +def _set_decode_area(codec, image, start_x=0, start_y=0, end_x=0, end_y=0): + """Wraps openjp2 library function opj_set_decode area. + + Sets the given area to be decoded. This function should be called right + after read_header and before any tile header reading. + + Parameters + ---------- + codec : _codec_t_p + Codec initialized by create_decompress function. + image : _image_t pointer + The decoded image previously set by read_header. + start_x, start_y : optional, int + The left and upper position of the rectangle to decode. + end_x, end_y : optional, int + The right and lower position of the rectangle to decode. + + Raises + ------ + RuntimeError + If the OpenJPEG library routine opj_set_decode_area fails. + """ + _OPENJP2.opj_set_decode_area(codec, image, + ctypes.c_int32(start_x), + ctypes.c_int32(start_y), + ctypes.c_int32(end_x), + ctypes.c_int32(end_y)) + + +def _set_default_decoder_parameters(): + """Wraps openjp2 library function opj_set_default_decoder_parameters. + + Sets decoding parameters to default values. + + Returns + ------- + dparam : _dparameters_t + Decompression parameters. + """ + dparams = _dparameters_t() + _OPENJP2.opj_set_default_decoder_parameters(ctypes.byref(dparams)) + return dparams + + +def _set_default_encoder_parameters(): + """Wraps openjp2 library function opj_set_default_encoder_parameters. + + Sets encoding parameters to default values. That means + + lossless + 1 tile + size of precinct : 2^15 x 2^15 (means 1 precinct) + size of code-block : 64 x 64 + number of resolutions: 6 + no SOP marker in the codestream + no EPH marker in the codestream + no sub-sampling in x or y direction + no mode switch activated + progression order: LRCP + no index file + no ROI upshifted + no offset of the origin of the image + no offset of the origin of the tiles + reversible DWT 5-3 + + The signature for this function differs from its C library counterpart, as + the the C function pass-by-reference parameter becomes the Python return + value. + + Returns + ------- + cparameters : _cparameters_t + Compression parameters. + """ + cparams = _cparameters_t() + _OPENJP2.opj_set_default_encoder_parameters(ctypes.byref(cparams)) + return cparams + + +def _set_error_handler(codec, handler, data=None): + """Wraps openjp2 library function opj_set_error_handler. + + Set the error handler use by openjpeg. + + Parameters + ---------- + codec : _codec_t_p + Codec initialized by create_compress function. + handler : python function + The callback function to be used. + user_data : anything + User/client data. + + Raises + ------ + RuntimeError + If the OpenJPEG library routine opj_set_error_handler fails. + """ + _OPENJP2.opj_set_error_handler(codec, handler, data) + + +def _set_info_handler(codec, handler, data=None): + """Wraps openjp2 library function opj_set_info_handler. + + Set the info handler use by openjpeg. + + Parameters + ---------- + codec : _codec_t_p + Codec initialized by create_compress function. + handler : python function + The callback function to be used. + user_data : anything + User/client data. + + Raises + ------ + RuntimeError + If the OpenJPEG library routine opj_set_info_handler fails. + """ + _OPENJP2.opj_set_info_handler(codec, handler, data) + + +def _set_warning_handler(codec, handler, data=None): + """Wraps openjp2 library function opj_set_warning_handler. + + Set the warning handler use by openjpeg. + + Parameters + ---------- + codec : _codec_t_p + Codec initialized by create_compress function. + handler : python function + The callback function to be used. + user_data : anything + User/client data. + + Raises + ------ + RuntimeError + If the OpenJPEG library routine opj_set_warning_handler fails. + """ + _OPENJP2.opj_set_warning_handler(codec, handler, data) + + +def _setup_decoder(codec, dparams): + """Wraps openjp2 library function opj_setup_decoder. + + Setup the decoder with decompression parameters. + + Parameters + ---------- + codec: _codec_t_p + Codec initialized by create_compress function. + dparams: _dparameters_t + Decompression parameters. + + Raises + ------ + RuntimeError + If the OpenJPEG library routine opj_setup_decoder fails. + """ + _OPENJP2.opj_setup_decoder(codec, ctypes.byref(dparams)) + + +def _setup_encoder(codec, cparams, image): + """Wraps openjp2 library function opj_setup_encoder. + + Setup the encoder parameters using the current image and using user + parameters. + + Parameters + ---------- + codec : _codec_t_p + codec initialized by create_compress function + cparams : _cparameters_t + compression parameters + image : _image_t + input-filled image + + Raises + ------ + RuntimeError + If the OpenJPEG library routine opj_setup_encoder fails. + """ + _OPENJP2.opj_setup_encoder(codec, ctypes.byref(cparams), image) + + +def _start_compress(codec, image, stream): + """Wraps openjp2 library function opj_start_compress. + + Start to compress the current image. + + Parameters + ---------- + codec : _codec_t_p + Compressor handle. + image : pointer to _image_t + Input filled image. + stream : _stream_t_p + Input stream. + + Raises + ------ + RuntimeError + If the OpenJPEG library routine opj_start_compress fails. + """ + _OPENJP2.opj_start_compress(codec, image, stream) + + +def _stream_create_default_file_stream_v3(fname, a_read_stream): + """Wraps openjp2 library function opj_stream_create_default_vile_stream_v3. + + Sets the stream to be a file stream. + + Parameters + ---------- + fname : str + Specifies a file. + a_read_stream: bool + True (read) or False (write) + + Returns + ------- + stream : stream_t + An OpenJPEG file stream. + """ + tf = 1 if a_read_stream else 0 + fn = ctypes.c_char_p(fname.encode()) + stream = _OPENJP2.opj_stream_create_default_file_stream_v3(fn, tf) + return stream + + +def _stream_destroy_v3(stream): + """Wraps openjp2 library function opj_stream_destroy. + + Destroys the stream created by create_stream_v3. + + Parameters + ---------- + stream : _stream_t_p + The file stream. + """ + _OPENJP2.opj_stream_destroy_v3(stream) + + +def _write_tile(codec, tile_index, data, data_size, stream): + """Wraps openjp2 library function opj_write_tile. + + Write a tile into an image. + + Parameters + ---------- + codec : _codec_t_p + The jpeg2000 codec + tile_index : int + The index of the tile to write, zero-indexing assumed + data : array + Image data arranged in usual C-order + data_size : int + Size of a tile in bytes + stream : _stream_t_p + The stream to write data to + + Raises + ------ + RuntimeError + If the OpenJPEG library routine opj_write_tile fails. + """ + datap = data.ctypes.data_as(ctypes.POINTER(ctypes.c_uint8)) + _OPENJP2.opj_write_tile(codec, + ctypes.c_uint32(int(tile_index)), + datap, + ctypes.c_uint32(int(data_size)), + stream) + + +def _set_error_message(msg): + """The openjpeg error handler has recorded an error message.""" + global _ERROR_MSG_LST + _ERROR_MSG_LST.append(msg) diff --git a/glymur/lib/test/__init__.py b/glymur/lib/test/__init__.py new file mode 100644 index 0000000..9f68aec --- /dev/null +++ b/glymur/lib/test/__init__.py @@ -0,0 +1 @@ +from .test_openjp2 import TestOpenJP2 as openjp2 diff --git a/glymur/lib/test/test_openjp2.py b/glymur/lib/test/test_openjp2.py new file mode 100644 index 0000000..0bee92f --- /dev/null +++ b/glymur/lib/test/test_openjp2.py @@ -0,0 +1,400 @@ +import doctest +import os +import pkg_resources +import shutil +import struct +import sys +import tempfile +import unittest + +import numpy as np + +import glymur + + +# Doc tests should be run as well. +def load_tests(loader, tests, ignore): + tests.addTests(doctest.DocTestSuite('glymur.lib.openjp2')) + return tests + + +class TestOpenJP2(unittest.TestCase): + + def setUp(self): + pass + + def tearDown(self): + pass + + def test_set_default_encoder_parameters(self): + cparams = glymur.lib.openjp2._set_default_encoder_parameters() + + self.assertEqual(cparams.res_spec, 0) + self.assertEqual(cparams.cblockw_init, 64) + self.assertEqual(cparams.cblockh_init, 64) + self.assertEqual(cparams.numresolution, 6) + self.assertEqual(cparams.subsampling_dx, 1) + self.assertEqual(cparams.subsampling_dy, 1) + self.assertEqual(cparams.mode, 0) + self.assertEqual(cparams.prog_order, glymur.lib.openjp2.LRCP) + self.assertEqual(cparams.roi_shift, 0) + self.assertEqual(cparams.cp_tx0, 0) + self.assertEqual(cparams.cp_ty0, 0) + + self.assertEqual(cparams.irreversible, 0) + + def test_set_default_decoder_parameters(self): + dparams = glymur.lib.openjp2._set_default_decoder_parameters() + + self.assertEqual(dparams.DA_x0, 0) + self.assertEqual(dparams.DA_y0, 0) + self.assertEqual(dparams.DA_x1, 0) + self.assertEqual(dparams.DA_y1, 0) + + def tile_macro(self, codec, stream, imagep, tidx): + # called only by j2k_random_tile_access + glymur.lib.openjp2._get_decoded_tile(codec, stream, imagep, tidx) + for j in range(imagep.contents.numcomps): + self.assertIsNotNone(imagep.contents.comps[j].data) + + def j2k_random_tile_access(self, filename, codec_format=None): + # called by the test_rtaX methods + dparam = glymur.lib.openjp2._set_default_decoder_parameters() + + infile = filename.encode() + nelts = glymur.lib.openjp2._PATH_LEN - len(infile) + infile += b'0' * nelts + dparam.infile = infile + + dparam.decod_format = codec_format + + codec = glymur.lib.openjp2._create_decompress(codec_format) + + glymur.lib.openjp2._set_info_handler(codec, None) + glymur.lib.openjp2._set_warning_handler(codec, None) + glymur.lib.openjp2._set_error_handler(codec, None) + + x = (filename, True) + stream = glymur.lib.openjp2._stream_create_default_file_stream_v3(*x) + + glymur.lib.openjp2._setup_decoder(codec, dparam) + image = glymur.lib.openjp2._read_header(stream, codec) + + cstr_info = glymur.lib.openjp2._get_cstr_info(codec) + + tile_ul = 0 + tile_ur = cstr_info.contents.tw - 1 + tile_lr = cstr_info.contents.tw * cstr_info.contents.th - 1 + tile_ll = tile_lr - cstr_info.contents.tw + + self.tile_macro(codec, stream, image, tile_ul) + self.tile_macro(codec, stream, image, tile_ur) + self.tile_macro(codec, stream, image, tile_lr) + self.tile_macro(codec, stream, image, tile_ll) + + glymur.lib.openjp2._destroy_cstr_info(cstr_info) + + glymur.lib.openjp2._end_decompress(codec, stream) + glymur.lib.openjp2._destroy_codec(codec) + glymur.lib.openjp2._stream_destroy_v3(stream) + glymur.lib.openjp2._image_destroy(image) + + def tile_decoder(self, x0=None, y0=None, x1=None, y1=None, filename=None, + codec_format=None): + x = (filename, True) + stream = glymur.lib.openjp2._stream_create_default_file_stream_v3(*x) + dparam = glymur.lib.openjp2._set_default_decoder_parameters() + + dparam.decod_format = codec_format + + # Do not use layer decoding limitation. + dparam.cp_layer = 0 + + # do not use resolution reductions. + dparam.cp_reduce = 0 + + codec = glymur.lib.openjp2._create_decompress(codec_format) + + glymur.lib.openjp2._set_info_handler(codec, None) + glymur.lib.openjp2._set_warning_handler(codec, None) + glymur.lib.openjp2._set_error_handler(codec, None) + + glymur.lib.openjp2._setup_decoder(codec, dparam) + image = glymur.lib.openjp2._read_header(stream, codec) + glymur.lib.openjp2._set_decode_area(codec, image, x0, y0, x1, y1) + + data = np.zeros((1150, 2048, 3), dtype=np.uint8) + while True: + rargs = glymur.lib.openjp2._read_tile_header(codec, stream) + tidx = rargs[0] + sz = rargs[1] + go_on = rargs[-1] + if not go_on: + break + glymur.lib.openjp2._decode_tile_data(codec, tidx, data, sz, stream) + + glymur.lib.openjp2._end_decompress(codec, stream) + glymur.lib.openjp2._destroy_codec(codec) + glymur.lib.openjp2._stream_destroy_v3(stream) + glymur.lib.openjp2._image_destroy(image) + + def tile_encoder(self, num_comps=None, tile_width=None, tile_height=None, + filename=None, codec=None, comp_prec=None, + image_width=None, image_height=None, + irreversible=None): + num_tiles = (image_width / tile_width) * (image_height / tile_height) + tile_size = tile_width * tile_height * num_comps * comp_prec / 8 + + data = np.random.random((tile_height, tile_width, num_comps)) + data = (data * 255).astype(np.uint8) + + l_param = glymur.lib.openjp2._set_default_encoder_parameters() + + l_param.tcp_numlayers = 1 + l_param.cp_fixed_quality = 1 + l_param.tcp_distoratio[0] = 20 + + # position of the tile grid aligned with the image + l_param.cp_tx0 = 0 + l_param.cp_ty0 = 0 + + # tile size, we are using tile based encoding + l_param.tile_size_on = 1 + l_param.cp_tdx = tile_width + l_param.cp_tdy = tile_height + + # use irreversible encoding + l_param.irreversible = irreversible + + l_param.numresolution = 6 + + l_param.prog_order = glymur.lib.openjp2.LRCP + + l_params = (glymur.lib.openjp2._image_comptparm_t * num_comps)() + for j in range(num_comps): + l_params[j].dx = 1 + l_params[j].dy = 1 + l_params[j].h = image_height + l_params[j].w = image_width + l_params[j].sgnd = 0 + l_params[j].prec = comp_prec + l_params[j].x0 = 0 + l_params[j].y0 = 0 + + codec = glymur.lib.openjp2._create_compress(codec) + + glymur.lib.openjp2._set_info_handler(codec, None) + glymur.lib.openjp2._set_warning_handler(codec, None) + glymur.lib.openjp2._set_error_handler(codec, None) + + cspace = glymur.lib.openjp2._CLRSPC_SRGB + l_image = glymur.lib.openjp2._image_tile_create(l_params, cspace) + + l_image.contents.x0 = 0 + l_image.contents.y0 = 0 + l_image.contents.x1 = image_width + l_image.contents.y1 = image_height + l_image.contents.color_space = glymur.lib.openjp2._CLRSPC_SRGB + + glymur.lib.openjp2._setup_encoder(codec, l_param, l_image) + + x = (filename, False) + stream = glymur.lib.openjp2._stream_create_default_file_stream_v3(*x) + glymur.lib.openjp2._start_compress(codec, l_image, stream) + + for j in np.arange(num_tiles): + glymur.lib.openjp2._write_tile(codec, j, data, tile_size, stream) + + glymur.lib.openjp2._end_compress(codec, stream) + glymur.lib.openjp2._stream_destroy_v3(stream) + glymur.lib.openjp2._destroy_codec(codec) + glymur.lib.openjp2._image_destroy(l_image) + + def tte0_setup(self, filename): + kwargs = {'filename': filename, + 'codec': glymur.lib.openjp2._CODEC_J2K, + 'comp_prec': 8, + 'irreversible': 1, + 'num_comps': 3, + 'image_height': 200, + 'image_width': 200, + 'tile_height': 100, + 'tile_width': 100} + self.tile_encoder(**kwargs) + + def test_tte0(self): + # Runs test designated tte0 in OpenJPEG test suite. + with tempfile.NamedTemporaryFile(suffix=".j2k") as tfile: + self.tte0_setup(tfile.name) + + def test_ttd0(self): + # Runs test designated ttd0 in OpenJPEG test suite. + with tempfile.NamedTemporaryFile(suffix=".j2k") as tfile: + + # Produce the tte0 output file for ttd0 input. + self.tte0_setup(tfile.name) + + kwargs = {'x0': 0, + 'y0': 0, + 'x1': 1000, + 'y1': 1000, + 'filename': tfile.name, + 'codec_format': glymur.lib.openjp2._CODEC_J2K} + self.tile_decoder(**kwargs) + + def tte1_setup(self, filename): + kwargs = {'filename': filename, + 'codec': glymur.lib.openjp2._CODEC_J2K, + 'comp_prec': 8, + 'irreversible': 1, + 'num_comps': 3, + 'image_height': 256, + 'image_width': 256, + 'tile_height': 128, + 'tile_width': 128} + self.tile_encoder(**kwargs) + + def test_tte1(self): + with tempfile.NamedTemporaryFile(suffix=".j2k") as tfile: + # Runs test designated tte1 in OpenJPEG test suite. + self.tte1_setup(tfile.name) + + def test_ttd1(self): + # Runs test designated ttd1 in OpenJPEG test suite. + with tempfile.NamedTemporaryFile(suffix=".j2k") as tfile: + + # Produce the tte0 output file for ttd0 input. + self.tte1_setup(tfile.name) + + kwargs = {'x0': 0, + 'y0': 0, + 'x1': 128, + 'y1': 128, + 'filename': tfile.name, + 'codec_format': glymur.lib.openjp2._CODEC_J2K} + self.tile_decoder(**kwargs) + + def test_rta1(self): + with tempfile.NamedTemporaryFile(suffix=".j2k") as tfile: + # Runs test designated rta1 in OpenJPEG test suite. + self.tte1_setup(tfile.name) + + kwargs = {'codec_format': glymur.lib.openjp2._CODEC_J2K} + self.j2k_random_tile_access(tfile.name, **kwargs) + + def tte2_setup(self, filename): + kwargs = {'filename': filename, + 'codec': glymur.lib.openjp2._CODEC_JP2, + 'comp_prec': 8, + 'irreversible': 1, + 'num_comps': 3, + 'image_height': 256, + 'image_width': 256, + 'tile_height': 128, + 'tile_width': 128} + self.tile_encoder(**kwargs) + + def test_tte2(self): + # Runs test designated tte2 in OpenJPEG test suite. + with tempfile.NamedTemporaryFile(suffix=".jp2") as tfile: + self.tte2_setup(tfile.name) + + def test_ttd2(self): + # Runs test designated ttd2 in OpenJPEG test suite. + with tempfile.NamedTemporaryFile(suffix=".jp2") as tfile: + # Produce the tte0 output file for ttd0 input. + self.tte2_setup(tfile.name) + + kwargs = {'x0': 0, + 'y0': 0, + 'x1': 128, + 'y1': 128, + 'filename': tfile.name, + 'codec_format': glymur.lib.openjp2._CODEC_JP2} + self.tile_decoder(**kwargs) + + def test_rta2(self): + with tempfile.NamedTemporaryFile(suffix=".jp2") as tfile: + # Runs test designated rta2 in OpenJPEG test suite. + self.tte2_setup(tfile.name) + + kwargs = {'codec_format': glymur.lib.openjp2._CODEC_JP2} + self.j2k_random_tile_access(tfile.name, **kwargs) + + def tte3_setup(self, filename): + kwargs = {'filename': filename, + 'codec': glymur.lib.openjp2._CODEC_J2K, + 'comp_prec': 8, + 'irreversible': 1, + 'num_comps': 1, + 'image_height': 256, + 'image_width': 256, + 'tile_height': 128, + 'tile_width': 128} + self.tile_encoder(**kwargs) + + def test_tte3(self): + with tempfile.NamedTemporaryFile(suffix=".j2k") as tfile: + # Runs test designated tte3 in OpenJPEG test suite. + self.tte3_setup(tfile.name) + + def test_rta3(self): + # Runs test designated rta3 in OpenJPEG test suite. + with tempfile.NamedTemporaryFile(suffix=".j2k") as tfile: + self.tte3_setup(tfile.name) + + kwargs = {'codec_format': glymur.lib.openjp2._CODEC_J2K} + self.j2k_random_tile_access(tfile.name, **kwargs) + + def tte4_setup(self, filename): + kwargs = {'filename': filename, + 'codec': glymur.lib.openjp2._CODEC_J2K, + 'comp_prec': 8, + 'irreversible': 0, + 'num_comps': 1, + 'image_height': 256, + 'image_width': 256, + 'tile_height': 128, + 'tile_width': 128} + self.tile_encoder(**kwargs) + + def test_tte4(self): + # Runs test designated tte4 in OpenJPEG test suite. + with tempfile.NamedTemporaryFile(suffix=".j2k") as tfile: + self.tte4_setup(tfile.name) + + def test_rta4(self): + # Runs test designated rta4 in OpenJPEG test suite. + with tempfile.NamedTemporaryFile(suffix=".j2k") as tfile: + self.tte4_setup(tfile.name) + + kwargs = {'codec_format': glymur.lib.openjp2._CODEC_J2K} + self.j2k_random_tile_access(tfile.name, **kwargs) + + def tte5_setup(self, filename): + kwargs = {'filename': filename, + 'codec': glymur.lib.openjp2._CODEC_J2K, + 'comp_prec': 8, + 'irreversible': 0, + 'num_comps': 1, + 'image_height': 512, + 'image_width': 512, + 'tile_height': 256, + 'tile_width': 256} + self.tile_encoder(**kwargs) + + def test_tte5(self): + # Runs test designated tte5 in OpenJPEG test suite. + with tempfile.NamedTemporaryFile(suffix=".j2k") as tfile: + self.tte5_setup(tfile.name) + + def test_rta5(self): + # Runs test designated rta5 in OpenJPEG test suite. + with tempfile.NamedTemporaryFile(suffix=".j2k") as tfile: + self.tte5_setup(tfile.name) + + kwargs = {'codec_format': glymur.lib.openjp2._CODEC_J2K} + self.j2k_random_tile_access(tfile.name, **kwargs) + +if __name__ == "__main__": + unittest.main() diff --git a/glymur/test/__init__.py b/glymur/test/__init__.py new file mode 100644 index 0000000..9677af5 --- /dev/null +++ b/glymur/test/__init__.py @@ -0,0 +1,7 @@ +from .test_callbacks import TestCallbacks as callbacks +from .test_codestream import TestCodestream as codestream +from .test_jp2k import TestJp2k as jp2k +from .test_printing import TestPrinting as printing +from .test_opj_suite import TestSuite as suite +from .test_opj_suite_write import TestSuiteWrite as suitew +from .test_opj_suite_neg import TestSuiteNegative as suiteneg diff --git a/glymur/test/test_callbacks.py b/glymur/test/test_callbacks.py new file mode 100644 index 0000000..1c70743 --- /dev/null +++ b/glymur/test/test_callbacks.py @@ -0,0 +1,72 @@ +import os +import pkg_resources +import sys +import tempfile +import unittest +import warnings + +if sys.hexversion < 0x03000000: + from StringIO import StringIO +else: + from io import StringIO + +import glymur + +try: + data_root = os.environ['OPJ_DATA_ROOT'] +except KeyError: + data_root = None +except: + raise + + +class TestCallbacks(unittest.TestCase): + + def setUp(self): + # Save sys.stdout. + self.stdout = sys.stdout + sys.stdout = StringIO() + self.jp2file = pkg_resources.resource_filename(glymur.__name__, + "data/nemo.jp2") + + def tearDown(self): + # Restore stdout. + sys.stdout = self.stdout + + def test_info_callback_on_write(self): + # Verify the messages printed when writing an image in verbose mode. + j = glymur.Jp2k(self.jp2file) + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + tiledata = j.read(tile=0) + with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile: + j = glymur.Jp2k(tfile.name, 'wb') + j.write(tiledata, verbose=True) + actual = sys.stdout.getvalue().strip() + expected = '[INFO] tile number 1 / 1' + self.assertEqual(actual, expected) + + def test_info_warning_callbacks_on_read(self): + # Verify that we get the expected stdio output when our internal info + # callback handler is enabled. + j = glymur.Jp2k(self.jp2file) + d = j.read(reduce=3, verbose=True, area=(0, 0, 512, 1024)) + actual = sys.stdout.getvalue().strip() + + lines = ['[INFO] Start to read j2k main header (85).', + '[INFO] Main header has been correctly decoded.', + '[INFO] Setting decoding area to 0,0,1024,512', + '[INFO] Header of tile 0 / 17 has been read.', + '[INFO] Tile 1/18 has been decoded.', + '[INFO] Image data has been updated with tile 1.', + '[INFO] Header of tile 1 / 17 has been read.', + '[INFO] Tile 2/18 has been decoded.', + '[INFO] Image data has been updated with tile 2.', + '[INFO] Stream reached its end !'] + + expected = '\n'.join(lines) + self.assertEqual(actual, expected) + + +if __name__ == "__main__": + unittest.main() diff --git a/glymur/test/test_codestream.py b/glymur/test/test_codestream.py new file mode 100644 index 0000000..4acfb79 --- /dev/null +++ b/glymur/test/test_codestream.py @@ -0,0 +1,92 @@ +import os +import struct +import sys +import tempfile +import unittest + +import numpy as np +import pkg_resources + +from glymur import Jp2k +import glymur + +try: + data_root = os.environ['OPJ_DATA_ROOT'] +except KeyError: + data_root = None +except: + raise + + +@unittest.skipIf(data_root is None, + "OPJ_DATA_ROOT environment variable not set") +class TestCodestream(unittest.TestCase): + + def setUp(self): + self.jp2file = pkg_resources.resource_filename(glymur.__name__, + "data/nemo.jp2") + + def tearDown(self): + pass + + def test_reserved_marker_segment(self): + # Some marker segments were reserved in FCD15444-1. Since that + # standard is old, some of them may have come into use. + # + # Let's inject a reserved marker segment into a file that + # we know something about to make sure we can still parse it. + filename = os.path.join(data_root, 'input/conformance/p0_01.j2k') + with tempfile.NamedTemporaryFile(suffix='.j2k') as tfile: + with open(filename, 'rb') as ifile: + # Everything up until the first QCD marker. + buffer = ifile.read(45) + tfile.write(buffer) + + # Write the new marker segment, 0xff6f = 65391 + buffer = struct.pack('>HHB', int(65391), int(3), int(0)) + tfile.write(buffer) + + # Get the rest of the input file. + buffer = ifile.read() + tfile.write(buffer) + tfile.flush() + + j = Jp2k(tfile.name) + c = j.get_codestream() + + self.assertEqual(c.segment[2].id, '0xff6f') + self.assertEqual(c.segment[2].length, 3) + self.assertEqual(c.segment[2].data, b'\x00') + + @unittest.skipIf(sys.hexversion < 0x03020000, + "Uses features introduced in 3.2.") + def test_unknown_marker_segment(self): + # Let's inject a marker segment whose marker does not appear to + # be valid. We still parse the file, but warn about the offending + # marker. + filename = os.path.join(data_root, 'input/conformance/p0_01.j2k') + with tempfile.NamedTemporaryFile(suffix='.j2k') as tfile: + with open(filename, 'rb') as ifile: + # Everything up until the first QCD marker. + buffer = ifile.read(45) + tfile.write(buffer) + + # Write the new marker segment, 0xff79 = 65401 + buffer = struct.pack('>HHB', int(65401), int(3), int(0)) + tfile.write(buffer) + + # Get the rest of the input file. + buffer = ifile.read() + tfile.write(buffer) + tfile.flush() + + with self.assertWarns(UserWarning) as cw: + j = Jp2k(tfile.name) + c = j.get_codestream() + + self.assertEqual(c.segment[2].id, '0xff79') + self.assertEqual(c.segment[2].length, 3) + self.assertEqual(c.segment[2].data, b'\x00') + +if __name__ == "__main__": + unittest.main() diff --git a/glymur/test/test_jp2k.py b/glymur/test/test_jp2k.py new file mode 100644 index 0000000..256cade --- /dev/null +++ b/glymur/test/test_jp2k.py @@ -0,0 +1,602 @@ +import contextlib +import ctypes +import doctest +import imp +import os +import re +import struct +import sys +import tempfile +import uuid +import unittest +if sys.hexversion <= 0x03030000: + from mock import patch +else: + from unittest.mock import patch +import warnings +from xml.etree import cElementTree as ET + +import numpy as np +import pkg_resources + +from glymur import Jp2k +from glymur.lib import openjp2 as opj2 +import glymur + +try: + data_root = os.environ['OPJ_DATA_ROOT'] +except KeyError: + data_root = None +except: + raise + + +# Doc tests should be run as well. +def load_tests(loader, tests, ignore): + tests.addTests(doctest.DocTestSuite('glymur.jp2k')) + return tests + + +@contextlib.contextmanager +def chdir(dirname=None): + curdir = os.getcwd() + try: + if dirname is not None: + os.chdir(dirname) + yield + finally: + os.chdir(curdir) + + +class TestJp2k(unittest.TestCase): + + def setUp(self): + self.jp2file = pkg_resources.resource_filename(glymur.__name__, + "data/nemo.jp2") + + def tearDown(self): + pass + + @unittest.skipIf(sys.hexversion < 0x03020000, + "Uses features introduced in 3.2.") + def test_invalid_xml_box(self): + # Should be able to recover from xml box with bad xml. + with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile: + with open(self.jp2file, 'rb') as ifile: + # Everything up until the jp2c box. + buffer = ifile.read(77) + tfile.write(buffer) + + # Write the xml box with bad xml + # Length = 28, id is 'xml '. + buffer = struct.pack('>I4s', int(28), b'xml ') + tfile.write(buffer) + + buffer = 'this is a test' + buffer = buffer.encode() + tfile.write(buffer) + + # Get the rest of the input file. + buffer = ifile.read() + tfile.write(buffer) + tfile.flush() + + with self.assertWarns(UserWarning) as cw: + jp2k = Jp2k(tfile.name) + + self.assertEqual(jp2k.box[3].id, 'xml ') + self.assertEqual(jp2k.box[3].offset, 77) + self.assertEqual(jp2k.box[3].length, 28) + self.assertIsNone(jp2k.box[3].xml) + + def test_bad_area_parameter(self): + # Verify that we error out appropriately if given a bad area parameter. + j = Jp2k(self.jp2file) + with self.assertRaises(IOError): + # Start corner must be >= 0 + d = j.read(area=(-1, -1, 1, 1)) + with self.assertRaises(IOError): + # End corner must be > 0 + d = j.read(area=(10, 10, 0, 0)) + with self.assertRaises(IOError): + # End corner must be >= start corner + d = j.read(area=(10, 10, 8, 8)) + + def test_reduce_too_high(self): + # Verify that we error out appropriately if not given a JPEG 2000 file. + j = Jp2k(self.jp2file) + with self.assertRaises(IOError): + d = j.read(reduce=6) + + def test_not_JPEG2000(self): + # Verify that we error out appropriately if not given a JPEG 2000 file. + filename = pkg_resources.resource_filename(glymur.__name__, "jp2k.py") + with self.assertRaises(IOError): + jp2k = Jp2k(filename) + + def test_file_not_present(self): + # Verify that we error out appropriately if not given an existing file + # at all. + if sys.hexversion < 0x03030000: + error = OSError + else: + error = IOError + with self.assertRaises(error): + filename = 'this file does not actually exist on the file system.' + jp2k = Jp2k(filename) + + def test_nemo_tile(self): + # Issue 134, trouble reading first nemo tile. + j = Jp2k(self.jp2file) + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + tiledata = j.read(tile=0) + subsetdata = j.read(area=(0, 0, 512, 512)) + np.testing.assert_array_equal(tiledata, subsetdata) + + def test_jp2_boxes(self): + # Verify the boxes of a JP2 file. + jp2k = Jp2k(self.jp2file) + + # top-level boxes + self.assertEqual(len(jp2k.box), 4) + + self.assertEqual(jp2k.box[0].id, 'jP ') + self.assertEqual(jp2k.box[0].offset, 0) + self.assertEqual(jp2k.box[0].length, 12) + self.assertEqual(jp2k.box[0].longname, 'JPEG 2000 Signature') + + self.assertEqual(jp2k.box[1].id, 'ftyp') + self.assertEqual(jp2k.box[1].offset, 12) + self.assertEqual(jp2k.box[1].length, 20) + self.assertEqual(jp2k.box[1].longname, 'File Type') + + self.assertEqual(jp2k.box[2].id, 'jp2h') + self.assertEqual(jp2k.box[2].offset, 32) + self.assertEqual(jp2k.box[2].length, 45) + self.assertEqual(jp2k.box[2].longname, 'JP2 Header') + + self.assertEqual(jp2k.box[3].id, 'jp2c') + self.assertEqual(jp2k.box[3].offset, 77) + self.assertEqual(jp2k.box[3].length, 1133427) + + # jp2h super box + self.assertEqual(len(jp2k.box[2].box), 2) + + self.assertEqual(jp2k.box[2].box[0].id, 'ihdr') + self.assertEqual(jp2k.box[2].box[0].offset, 40) + self.assertEqual(jp2k.box[2].box[0].length, 22) + self.assertEqual(jp2k.box[2].box[0].longname, 'Image Header') + self.assertEqual(jp2k.box[2].box[0].height, 1456) + self.assertEqual(jp2k.box[2].box[0].width, 2592) + self.assertEqual(jp2k.box[2].box[0].num_components, 3) + self.assertEqual(jp2k.box[2].box[0].bits_per_component, 8) + self.assertEqual(jp2k.box[2].box[0].signed, False) + self.assertEqual(jp2k.box[2].box[0].compression, 7) + self.assertEqual(jp2k.box[2].box[0].cspace_unknown, False) + self.assertEqual(jp2k.box[2].box[0].ip_provided, False) + + self.assertEqual(jp2k.box[2].box[1].id, 'colr') + self.assertEqual(jp2k.box[2].box[1].offset, 62) + self.assertEqual(jp2k.box[2].box[1].length, 15) + self.assertEqual(jp2k.box[2].box[1].longname, 'Colour Specification') + self.assertEqual(jp2k.box[2].box[1].precedence, 0) + self.assertEqual(jp2k.box[2].box[1].approximation, 0) + self.assertEqual(jp2k.box[2].box[1].color_space, glymur.core.SRGB) + self.assertIsNone(jp2k.box[2].box[1].icc_profile) + + @unittest.skipIf(data_root is None, + "OPJ_DATA_ROOT environment variable not set") + def test_j2k_box(self): + # Verify that a J2K file has no boxes. + filename = os.path.join(data_root, 'input/conformance/p0_01.j2k') + jp2k = Jp2k(filename) + self.assertEqual(len(jp2k.box), 0) + + def test_64bit_XL_field(self): + # Verify that boxes with the XL field are properly read. + # Don't have such a file on hand, so we create one. Copy our example + # file, but making the codestream have a 64-bit XL field. + with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile: + with open(self.jp2file, 'rb') as ifile: + # Everything up until the jp2c box. + buffer = ifile.read(77) + tfile.write(buffer) + + # The L field must be 1 in order to signal the presence of the + # XL field. The actual length of the jp2c box increased by 8 + # (8 bytes for the XL field). + L = 1 + T = b'jp2c' + XL = 1133427 + 8 + buffer = struct.pack('>I4sQ', int(L), T, XL) + tfile.write(buffer) + + # Get the rest of the input file (minus the 8 bytes for L and + # T. + ifile.seek(8, 1) + buffer = ifile.read() + tfile.write(buffer) + tfile.flush() + + jp2k = Jp2k(tfile.name) + + self.assertEqual(jp2k.box[3].id, 'jp2c') + self.assertEqual(jp2k.box[3].offset, 77) + self.assertEqual(jp2k.box[3].length, 1133427 + 8) + + def test_L_is_zero(self): + # Verify that boxes with the L field as zero are correctly read. + # This should only happen in the last box of a JPEG 2000 file. + # Our example image has its last box at byte 588458. + baseline_jp2 = Jp2k(self.jp2file) + with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile: + with open(self.jp2file, 'rb') as ifile: + # Everything up until the jp2c box. + buffer = ifile.read(588458) + tfile.write(buffer) + + L = 0 + T = b'uuid' + buffer = struct.pack('>I4s', int(L), T) + tfile.write(buffer) + + # Get the rest of the input file (minus the 8 bytes for L and + # T. + ifile.seek(8, 1) + buffer = ifile.read() + tfile.write(buffer) + tfile.flush() + + new_jp2 = Jp2k(tfile.name) + + # The top level boxes in each file should match. + for j in range(len(baseline_jp2.box)): + self.assertEqual(new_jp2.box[j].id, + baseline_jp2.box[j].id) + self.assertEqual(new_jp2.box[j].offset, + baseline_jp2.box[j].offset) + self.assertEqual(new_jp2.box[j].length, + baseline_jp2.box[j].length) + + @unittest.skipIf(data_root is None, + "OPJ_DATA_ROOT environment variable not set") + def test_read_differing_subsamples(self): + # Verify that we error out appropriately if we use the read method + # on an image with differing subsamples + # + # Issue 86. + filename = os.path.join(data_root, 'input/conformance/p0_05.j2k') + j = Jp2k(filename) + with self.assertRaises(IOError): + j.read() + + @unittest.skipIf(data_root is None, + "OPJ_DATA_ROOT environment variable not set") + def test_empty_box_with_j2k(self): + # Verify that the list of boxes in a J2C/J2K file is present, but + # empty. + filename = os.path.join(data_root, 'input/conformance/p0_05.j2k') + j = Jp2k(filename) + self.assertEqual(j.box, []) + + def test_code_block_height_different_than_width(self): + # Verify that we can set a code block size where height does not equal + # width. + data = np.zeros((128, 128), dtype=np.uint8) + with tempfile.NamedTemporaryFile(suffix='.j2k') as tfile: + j = Jp2k(tfile.name, 'wb') + + # The code block dimensions are given as rows x columns. + j.write(data, cbsize=(16, 32)) + + c = j.get_codestream() + + # Code block size is reported as XY in the codestream. + self.assertEqual(tuple(c.segment[2].SPcod[5:7]), (3, 2)) + + def test_negative_too_many_dimensions(self): + # OpenJP2 only allows 2D or 3D images. + with tempfile.NamedTemporaryFile(suffix='.j2k') as tfile: + j = Jp2k(tfile.name, 'wb') + with self.assertRaises(IOError) as ce: + data = np.zeros((128, 128, 2, 2), dtype=np.uint8) + j.write(data) + + def test_unrecognized_jp2_colorspace(self): + # We only allow RGB and GRAYSCALE. + with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile: + j = Jp2k(tfile.name, 'wb') + with self.assertRaises(IOError) as ce: + data = np.zeros((128, 128, 3), dtype=np.uint8) + j.write(data, colorspace='cmyk') + + def test_2D_rgb(self): + # RGB must have at least 3 components. + with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile: + j = Jp2k(tfile.name, 'wb') + with self.assertRaises(IOError) as ce: + data = np.zeros((128, 128, 2), dtype=np.uint8) + j.write(data, colorspace='rgb') + + def test_colorspace_with_j2k(self): + # Specifying a colorspace with J2K does not make sense. + with tempfile.NamedTemporaryFile(suffix='.j2k') as tfile: + j = Jp2k(tfile.name, 'wb') + with self.assertRaises(IOError) as ce: + data = np.zeros((128, 128, 3), dtype=np.uint8) + j.write(data, colorspace='rgb') + + def test_specify_rgb(self): + with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile: + j = Jp2k(tfile.name, 'wb') + data = np.zeros((128, 128, 3), dtype=np.uint8) + j.write(data, colorspace='rgb') + self.assertEqual(j.box[2].box[1].color_space, glymur.core.SRGB) + + def test_specify_gray(self): + with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile: + j = Jp2k(tfile.name, 'wb') + data = np.zeros((128, 128), dtype=np.uint8) + j.write(data, colorspace='gray') + self.assertEqual(j.box[2].box[1].color_space, + glymur.core.GREYSCALE) + + def test_specify_grey(self): + with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile: + j = Jp2k(tfile.name, 'wb') + data = np.zeros((128, 128), dtype=np.uint8) + j.write(data, colorspace='grey') + self.assertEqual(j.box[2].box[1].color_space, + glymur.core.GREYSCALE) + + def test_grey_with_extra_component(self): + with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile: + j = Jp2k(tfile.name, 'wb') + data = np.zeros((128, 128, 2), dtype=np.uint8) + j.write(data) + self.assertEqual(j.box[2].box[0].height, 128) + self.assertEqual(j.box[2].box[0].width, 128) + self.assertEqual(j.box[2].box[0].num_components, 2) + self.assertEqual(j.box[2].box[1].color_space, + glymur.core.GREYSCALE) + + def test_grey_with_two_extra_components(self): + with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile: + j = Jp2k(tfile.name, 'wb') + data = np.zeros((128, 128, 3), dtype=np.uint8) + j.write(data, colorspace='gray') + self.assertEqual(j.box[2].box[0].height, 128) + self.assertEqual(j.box[2].box[0].width, 128) + self.assertEqual(j.box[2].box[0].num_components, 3) + self.assertEqual(j.box[2].box[1].color_space, + glymur.core.GREYSCALE) + + def test_rgb_with_extra_component(self): + with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile: + j = Jp2k(tfile.name, 'wb') + data = np.zeros((128, 128, 4), dtype=np.uint8) + j.write(data) + self.assertEqual(j.box[2].box[0].height, 128) + self.assertEqual(j.box[2].box[0].width, 128) + self.assertEqual(j.box[2].box[0].num_components, 4) + self.assertEqual(j.box[2].box[1].color_space, glymur.core.SRGB) + + def test_specify_ycc(self): + # We don't support writing YCC at the moment. + with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile: + j = Jp2k(tfile.name, 'wb') + with self.assertRaises(IOError) as ce: + data = np.zeros((128, 128, 3), dtype=np.uint8) + j.write(data, colorspace='ycc') + + def test_uinf_ulst_url_boxes(self): + # Verify that we can read UINF, ULST, and URL boxes. I don't have + # easy access to such a file, and there's no such file in the + # openjpeg repository, so I'll fake one. + with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile: + with open(self.jp2file, 'rb') as ifile: + # Everything up until the jp2c box. + buffer = ifile.read(77) + tfile.write(buffer) + + # Write the UINF superbox + # Length = 50, id is uinf. + buffer = struct.pack('>I4s', int(50), b'uinf') + tfile.write(buffer) + + # Write the ULST box. + # Length is 26, 1 UUID, hard code that UUID as zeros. + buffer = struct.pack('>I4sHIIII', int(26), b'ulst', int(1), + int(0), int(0), int(0), int(0)) + tfile.write(buffer) + + # Write the URL box. + # Length is 16, version is one byte, flag is 3 bytes, url + # is the rest. + buffer = struct.pack('>I4sBBBB', + int(16), b'url ', + int(0), int(0), int(0), int(0)) + tfile.write(buffer) + buffer = struct.pack('>ssss', b'a', b'b', b'c', b'd') + tfile.write(buffer) + + # Get the rest of the input file. + buffer = ifile.read() + tfile.write(buffer) + tfile.flush() + + jp2k = Jp2k(tfile.name) + + self.assertEqual(jp2k.box[3].id, 'uinf') + self.assertEqual(jp2k.box[3].offset, 77) + self.assertEqual(jp2k.box[3].length, 50) + + self.assertEqual(jp2k.box[3].box[0].id, 'ulst') + self.assertEqual(jp2k.box[3].box[0].offset, 85) + self.assertEqual(jp2k.box[3].box[0].length, 26) + ulst = [] + ulst.append(uuid.UUID('00000000-0000-0000-0000-000000000000')) + self.assertEqual(jp2k.box[3].box[0].ulst, ulst) + + self.assertEqual(jp2k.box[3].box[1].id, 'url ') + self.assertEqual(jp2k.box[3].box[1].offset, 111) + self.assertEqual(jp2k.box[3].box[1].length, 16) + self.assertEqual(jp2k.box[3].box[1].version, 0) + self.assertEqual(jp2k.box[3].box[1].flag, (0, 0, 0)) + self.assertEqual(jp2k.box[3].box[1].URL, 'abcd') + + def test_xml_box_with_trailing_nulls(self): + # ElementTree does not like trailing null chars after valid XML + # text. + with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile: + with open(self.jp2file, 'rb') as ifile: + # Everything up until the jp2c box. + buffer = ifile.read(77) + tfile.write(buffer) + + # Write the xml box + # Length = 36, id is 'xml '. + buffer = struct.pack('>I4s', int(36), b'xml ') + tfile.write(buffer) + + buffer = 'this is a test' + chr(0) + buffer = buffer.encode() + tfile.write(buffer) + + # Get the rest of the input file. + buffer = ifile.read() + tfile.write(buffer) + tfile.flush() + + jp2k = Jp2k(tfile.name) + + self.assertEqual(jp2k.box[3].id, 'xml ') + self.assertEqual(jp2k.box[3].offset, 77) + self.assertEqual(jp2k.box[3].length, 36) + + def test_asoc_label_box(self): + # Construct a fake file with an asoc and a label box, as + # OpenJPEG doesn't have such a file. + data = Jp2k(self.jp2file).read(reduce=3) + with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile: + j = Jp2k(tfile.name, 'wb') + j.write(data) + + with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile2: + + # Offset of the codestream is where we start. + buffer = tfile.read(77) + tfile2.write(buffer) + + # read the rest of the file, it's the codestream. + codestream = tfile.read() + + # Write the asoc superbox. + # Length = 36, id is 'asoc'. + buffer = struct.pack('>I4s', int(56), b'asoc') + tfile2.write(buffer) + + # Write the contained label box + buffer = struct.pack('>I4s', int(13), b'lbl ') + tfile2.write(buffer) + tfile2.write('label'.encode()) + + # Write the xml box + # Length = 36, id is 'xml '. + buffer = struct.pack('>I4s', int(35), b'xml ') + tfile2.write(buffer) + + buffer = 'this is a test' + buffer = buffer.encode() + tfile2.write(buffer) + + # Now append the codestream. + tfile2.write(codestream) + + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + jasoc = Jp2k(tfile2.name) + self.assertEqual(jasoc.box[3].id, 'asoc') + self.assertEqual(jasoc.box[3].box[0].id, 'lbl ') + self.assertEqual(jasoc.box[3].box[0].label, 'label') + self.assertEqual(jasoc.box[3].box[1].id, 'xml ') + + def test_openjpeg_library_message(self): + # Verify the error message produced by the openjpeg library. + # This will confirm that the error callback mechanism is working. + with open(self.jp2file, 'rb') as fp: + data = fp.read() + with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile: + tfile.write(data[0:129]) + + # Make the DY bytes of the SIZ segment zero. That means that + # a subsampling factor is zero, which is illegal. + tfile.write(b'\x00') + tfile.write(data[130:132]) + tfile.write(b'\x00') + tfile.write(data[134:136]) + tfile.write(b'\x00') + + tfile.write(data[136:]) + tfile.flush() + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + j = Jp2k(tfile.name) + regexp = re.compile(r'''OpenJPEG\slibrary\serror:\s+ + Invalid\svalues\sfor\scomp\s=\s0\s+ + :\sdx=1\sdy=0''', re.VERBOSE) + if sys.hexversion < 0x03020000: + with self.assertRaisesRegexp(IOError, regexp) as ce: + d = j.read(reduce=3) + else: + with self.assertRaisesRegex(IOError, regexp) as ce: + d = j.read(reduce=3) + + @unittest.skipIf(sys.hexversion < 0x03020000, + "Uses features introduced in 3.2.") + def test_config_file_via_environ(self): + """Verify that we can read a configuration file set via environ var.""" + with tempfile.TemporaryDirectory() as tdir: + filename = os.path.join(tdir, 'glymurrc') + with open(filename, 'wb') as tfile: + tfile.write('[library]\n'.encode()) + line = 'openjp2: {0}\n'.format(glymur._OPENJP2._name) + tfile.write(line.encode()) + tfile.flush() + with patch.dict('os.environ', {'GLYMURCONFIGDIR': tdir}): + imp.reload(glymur) + j = Jp2k(self.jp2file) + + @unittest.skipIf(sys.hexversion < 0x03020000, + "Uses features introduced in 3.2.") + def test_config_file_via_environ_is_wrong(self): + # A non-existant library location should be rejected. + with tempfile.TemporaryDirectory() as tdir: + fname = os.path.join(tdir, 'glymurrc') + with open(fname, 'w') as fp: + with tempfile.NamedTemporaryFile(suffix='.dylib') as tfile: + fp.write('[library]\n') + fp.write('openjp2: {0}.not.there\n'.format(tfile.name)) + fp.flush() + with patch.dict('os.environ', {'GLYMURCONFIGDIR': tdir}): + # Misconfigured new configuration file should + # be rejected. + with self.assertRaises(ImportError) as ce: + imp.reload(glymur) + + @unittest.skipIf(sys.hexversion < 0x03020000, + "Uses features introduced in 3.2.") + def test_missing_config_file_via_environ(self): + # Verify that we error out properly if the configuration file + # specified via environment variable is not found. + with tempfile.TemporaryDirectory() as tdir: + with patch.dict('os.environ', {'GLYMURCONFIGDIR': tdir}): + # Misconfigured new configuration file should + # be rejected. + with self.assertRaises(ImportError) as ce: + imp.reload(glymur) + + +if __name__ == "__main__": + unittest.main() diff --git a/glymur/test/test_opj_suite.py b/glymur/test/test_opj_suite.py new file mode 100644 index 0000000..112fbaf --- /dev/null +++ b/glymur/test/test_opj_suite.py @@ -0,0 +1,7364 @@ +""" +The tests defined here roughly correspond to what is in the OpenJPEG test +suite. +""" + +import os +import platform +import re +import sys +from xml.etree import cElementTree as ET +import unittest +import warnings + +import numpy as np + +from glymur import Jp2k +import glymur + +try: + data_root = os.environ['OPJ_DATA_ROOT'] +except KeyError: + data_root = None +except: + raise + + +def mse(A, B): + """Mean Square Error""" + diff = A.astype(np.double) - B.astype(np.double) + #e = np.sqrt(np.mean(diff**2)) + e = np.mean(diff**2) + return e + + +def peak_tolerance(A, B): + """Peak Tolerance""" + diff = np.abs(A.astype(np.double) - B.astype(np.double)) + p = diff.max() + return p + + +def read_pgx(pgx_file): + """Helper function for reading the PGX comparison files. + + Open the file in ascii mode and read the header line. + Will look something like + + PG ML + 8 128 128 + PG%[ \t]%c%c%[ \t+-]%d%[ \t]%d%[ \t]%d" + """ + header = '' + with open(pgx_file, 'rb') as fp: + while True: + x = fp.read(1) + if x[0] == 10 or x == '\n': + pos = fp.tell() + break + else: + if sys.hexversion < 0x03000000: + header += x + else: + header += chr(x[0]) + + header = header.rstrip() + n = re.split('\s', header) + + if (n[1][0] == 'M') and (sys.byteorder == 'little'): + swapbytes = True + elif (n[1][0] == 'L') and (sys.byteorder == 'big'): + swapbytes = True + else: + swapbytes = False + + if (len(n) == 6): + bitdepth = int(n[3]) + signed = bitdepth < 0 + if signed: + bitdepth = -1 * bitdepth + nrows = int(n[5]) + ncols = int(n[4]) + else: + bitdepth = int(n[2]) + signed = bitdepth < 0 + if signed: + bitdepth = -1 * bitdepth + nrows = int(n[4]) + ncols = int(n[3]) + + if signed: + if bitdepth <= 8: + dtype = np.int8 + elif bitdepth <= 16: + dtype = np.int16 + else: + raise RuntimeError("unhandled bitdepth") + else: + if bitdepth <= 8: + dtype = np.uint8 + elif bitdepth <= 16: + dtype = np.uint16 + else: + raise RuntimeError("unhandled bitdepth") + + shape = [nrows, ncols] + + # Reopen the file in binary mode and seek to the start of the binary + # data + with open(pgx_file, 'rb') as fp: + fp.seek(pos) + data = np.fromfile(file=fp, dtype=dtype).reshape(shape) + + return(data.byteswap(swapbytes)) + + +@unittest.skipIf(data_root is None, + "OPJ_DATA_ROOT environment variable not set") +class TestSuite(unittest.TestCase): + + def setUp(self): + pass + + def tearDown(self): + pass + + def test_ETS_C0P0_p0_01_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p0_01.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=0) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c0p0_01.pgx') + pgxdata = read_pgx(pgxfile) + np.testing.assert_array_equal(jpdata, pgxdata) + + def test_ETS_C0P0_p0_02_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p0_02.j2k') + with warnings.catch_warnings(): + # There's a 0xff30 marker segment. Not illegal, but we don't + # really know what to do with it. Just ignore. + warnings.simplefilter("ignore") + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=0) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c0p0_02.pgx') + pgxdata = read_pgx(pgxfile) + np.testing.assert_array_equal(jpdata, pgxdata) + + @unittest.skip("Known failure in OPENJPEG test suite.") + def test_ETS_C0P0_p0_03_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p0_03.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=0) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c0p0_03r0.pgx') + pgxdata = read_pgx(pgxfile) + np.testing.assert_array_equal(jpdata, pgxdata) + + def test_ETS_C0P0_p0_03_j2k_r1(self): + jfile = os.path.join(data_root, 'input/conformance/p0_03.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=1) + + pgxfile = os.path.join(data_root, + 'baseline/conformance/c0p0_03r1.pgx') + pgxdata = read_pgx(pgxfile) + np.testing.assert_array_equal(jpdata, pgxdata) + + @unittest.skip("Known failure in OPENJPEG test suite.") + def test_ETS_C0P0_p0_04_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p0_04.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=3) + + pgxfile = os.path.join(data_root, + 'baseline/conformance/c0p0_04.pgx') + pgxdata = read_pgx(pgxfile) + + self.assertTrue(peak_tolerance(jpdata[:, :, 2], pgxdata) < 33) + self.assertTrue(mse(jpdata[:, :, 2], pgxdata) < 55.8) + + @unittest.skip("Known failure in OPENJPEG test suite.") + def test_ETS_C0P0_p0_05_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p0_05.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read_bands(reduce=3) + + pgxfile = os.path.join(data_root, + 'baseline/conformance/c0p0_05.pgx') + pgxdata = read_pgx(pgxfile) + self.assertTrue(peak_tolerance(jpdata[0], pgxdata) < 54) + self.assertTrue(mse(jpdata[0], pgxdata) < 68) + + @unittest.skip("Known failure in OPENJPEG test suite.") + def test_ETS_C0P0_p0_06_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p0_06.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=3) + + pgxfile = os.path.join(data_root, + 'baseline/conformance/c0p0_06.pgx') + pgxdata = read_pgx(pgxfile) + self.assertTrue(peak_tolerance(jpdata[:, :, 0], pgxdata) < 109) + self.assertTrue(mse(jpdata[:, :, 0], pgxdata) < 743) + + @unittest.skip("Known failure in OPENJPEG test suite.") + def test_ETS_C0P0_p0_07_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p0_07.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read() + + pgxfile = os.path.join(data_root, + 'baseline/conformance/c0p0_07.pgx') + pgxdata = read_pgx(pgxfile) + + self.assertTrue(peak_tolerance(jpdata[:, :, 0], pgxdata) < 10) + self.assertTrue(mse(jpdata[:, :, 0], pgxdata) < 0.34) + + @unittest.skip("Known failure in OPENJPEG test suite.") + def test_ETS_C0P0_p0_08_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p0_08.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=5) + + pgxfile = os.path.join(data_root, + 'baseline/conformance/c0p0_08.pgx') + pgxdata = read_pgx(pgxfile) + + self.assertTrue(peak_tolerance(jpdata[:, :, 0], pgxdata) < 7) + self.assertTrue(mse(jpdata[:, :, 0], pgxdata) < 6.72) + + def test_ETS_C0P0_p0_09_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p0_09.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=2) + + pgxfile = os.path.join(data_root, + 'baseline/conformance/c0p0_09.pgx') + pgxdata = read_pgx(pgxfile) + + self.assertTrue(peak_tolerance(jpdata, pgxdata) < 4) + self.assertTrue(mse(jpdata, pgxdata) < 1.47) + + @unittest.skip("Known failure in OPENJPEG test suite.") + def test_ETS_C0P0_p0_10_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p0_10.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=0) + + pgxfile = os.path.join(data_root, + 'baseline/conformance/c0p0_10.pgx') + pgxdata = read_pgx(pgxfile) + + self.assertTrue(peak_tolerance(jpdata[:, :, 0], pgxdata) < 10) + self.assertTrue(mse(jpdata[:, :, 0], pgxdata) < 2.84) + + def test_ETS_C0P0_p0_11_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p0_11.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=0) + + pgxfile = os.path.join(data_root, + 'baseline/conformance/c0p0_11.pgx') + pgxdata = read_pgx(pgxfile) + + np.testing.assert_array_equal(jpdata, pgxdata) + + def test_ETS_C0P0_p0_12_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p0_12.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=0) + + pgxfile = os.path.join(data_root, + 'baseline/conformance/c0p0_12.pgx') + pgxdata = read_pgx(pgxfile) + + np.testing.assert_array_equal(jpdata, pgxdata) + + @unittest.skip("Known failure in OPENJPEG test suite.") + def test_ETS_C0P0_p0_13_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p0_13.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=0) + + pgxfile = os.path.join(data_root, + 'baseline/conformance/c0p0_13.pgx') + pgxdata = read_pgx(pgxfile) + + np.testing.assert_array_equal(jpdata, pgxdata) + + @unittest.skip("Known failure in OPENJPEG test suite.") + def test_ETS_C0P0_p0_14_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p0_14.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=2) + + pgxfile = os.path.join(data_root, + 'baseline/conformance/c0p0_14.pgx') + pgxdata = read_pgx(pgxfile) + + np.testing.assert_array_equal(jpdata[:, :, 0], pgxdata) + + @unittest.skip("Known failure in OPENJPEG test suite.") + def test_ETS_C0P0_p0_15_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p0_15.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=0) + + pgxfile = os.path.join(data_root, + 'baseline/conformance/c0p0_15r0.pgx') + pgxdata = read_pgx(pgxfile) + + np.testing.assert_array_equal(jpdata, pgxdata) + + def test_ETS_C0P0_p0_15_j2k_r1(self): + jfile = os.path.join(data_root, 'input/conformance/p0_15.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=1) + + pgxfile = os.path.join(data_root, + 'baseline/conformance/c0p0_15r1.pgx') + pgxdata = read_pgx(pgxfile) + + np.testing.assert_array_equal(jpdata, pgxdata) + + def test_ETS_C0P0_p0_16_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p0_16.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=0) + + pgxfile = os.path.join(data_root, + 'baseline/conformance/c0p0_16.pgx') + pgxdata = read_pgx(pgxfile) + + np.testing.assert_array_equal(jpdata, pgxdata) + + def test_ETS_C0P1_p1_01_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p1_01.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=0) + + pgxfile = os.path.join(data_root, + 'baseline/conformance/c0p1_01.pgx') + pgxdata = read_pgx(pgxfile) + + np.testing.assert_array_equal(jpdata, pgxdata) + + @unittest.skip("Known failure in OPENJPEG test suite operation.") + def test_ETS_C0P1_p1_02_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p1_02.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=3) + + pgxfile = os.path.join(data_root, + 'baseline/conformance/c0p1_02.pgx') + pgxdata = read_pgx(pgxfile) + + print(peak_tolerance(jpdata[:, :, 0], pgxdata)) + print(peak_tolerance(jpdata[:, :, 1], pgxdata)) + print(peak_tolerance(jpdata[:, :, 2], pgxdata)) + self.assertTrue(peak_tolerance(jpdata[:, :, 0], pgxdata) < 35) + self.assertTrue(mse(jpdata[:, :, 0], pgxdata) < 74) + + @unittest.skip("Known failure in OPENJPEG test suite operation.") + def test_ETS_C0P1_p1_03_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p1_03.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=3) + + pgxfile = os.path.join(data_root, + 'baseline/conformance/c0p1_03.pgx') + pgxdata = read_pgx(pgxfile) + + print(peak_tolerance(jpdata[:, :, 0], pgxdata)) + print(peak_tolerance(jpdata[:, :, 1], pgxdata)) + print(peak_tolerance(jpdata[:, :, 2], pgxdata)) + self.assertTrue(peak_tolerance(jpdata[:, :, 0], pgxdata) < 28) + self.assertTrue(mse(jpdata[:, :, 0], pgxdata) < 18.8) + + @unittest.skip("Known failure in OPENJPEG test suite operation.") + def test_ETS_C0P1_p1_04_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p1_04.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=0) + + pgxfile = os.path.join(data_root, + 'baseline/conformance/c0p1_04r0.pgx') + pgxdata = read_pgx(pgxfile) + + print(peak_tolerance(jpdata, pgxdata)) + self.assertTrue(peak_tolerance(jpdata, pgxdata) < 2) + self.assertTrue(mse(jpdata, pgxdata) < 0.55) + + @unittest.skip("Known failure in OPENJPEG test suite, precision issue.") + def test_ETS_C0P1_p1_04_j2k_r3(self): + jfile = os.path.join(data_root, 'input/conformance/p1_04.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=3) + + pgxfile = os.path.join(data_root, + 'baseline/conformance/c0p1_04r3.pgx') + pgxdata = read_pgx(pgxfile) + + print(peak_tolerance(jpdata, pgxdata)) + self.assertTrue(peak_tolerance(jpdata, pgxdata) < 2) + self.assertTrue(mse(jpdata, pgxdata) < 0.55) + + @unittest.skip("Known failure in OPENJPEG test suite operation.") + def test_ETS_C0P1_p1_05_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p1_05.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=4) + + pgxfile = os.path.join(data_root, + 'baseline/conformance/c0p1_05.pgx') + pgxdata = read_pgx(pgxfile) + + print(peak_tolerance(jpdata[:, :, 0], pgxdata)) + print(peak_tolerance(jpdata[:, :, 1], pgxdata)) + self.assertTrue(peak_tolerance(jpdata[:, :, 0], pgxdata) < 128) + self.assertTrue(mse(jpdata[:, :, 0], pgxdata) < 16384) + + @unittest.skip("Known failure in OPENJPEG test suite operation.") + def test_ETS_C0P1_p1_06_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p1_06.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=1) + + pgxfile = os.path.join(data_root, + 'baseline/conformance/c0p1_06.pgx') + pgxdata = read_pgx(pgxfile) + + print(peak_tolerance(jpdata[:, :, 0], pgxdata)) + print(peak_tolerance(jpdata[:, :, 1], pgxdata)) + self.assertTrue(peak_tolerance(jpdata[:, :, 0], pgxdata) < 128) + self.assertTrue(mse(jpdata[:, :, 0], pgxdata) < 16384) + + @unittest.skip("Known failure in OPENJPEG test suite operation.") + def test_ETS_C0P1_p1_07_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p1_07.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=0) + + pgxfile = os.path.join(data_root, + 'baseline/conformance/c0p1_07.pgx') + pgxdata = read_pgx(pgxfile) + + # This one works. + np.testing.assert_array_equal(jpdata[:, :, 0], pgxdata) + # This one does not. + np.testing.assert_array_equal(jpdata[:, :, 1], pgxdata) + + def test_ETS_C1P0_p0_01_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p0_01.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=0) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p0_01_0.pgx') + pgxdata = read_pgx(pgxfile) + + np.testing.assert_array_equal(jpdata, pgxdata) + + def test_ETS_C1P0_p0_02_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p0_02.j2k') + with warnings.catch_warnings(): + # There's a 0xff30 marker segment. Not illegal, but we don't + # really know what to do with it. Just ignore. + warnings.simplefilter("ignore") + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=0) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p0_02_0.pgx') + pgxdata = read_pgx(pgxfile) + + np.testing.assert_array_equal(jpdata, pgxdata) + + def test_ETS_C1P0_p0_03_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p0_03.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=0) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p0_03_0.pgx') + pgxdata = read_pgx(pgxfile) + + np.testing.assert_array_equal(jpdata, pgxdata) + + def test_ETS_C1P0_p0_04_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p0_04.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=0) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p0_04_0.pgx') + pgxdata = read_pgx(pgxfile) + self.assertTrue(peak_tolerance(jpdata[:, :, 0], pgxdata) < 5) + self.assertTrue(mse(jpdata[:, :, 0], pgxdata) < 0.776) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p0_04_1.pgx') + pgxdata = read_pgx(pgxfile) + self.assertTrue(peak_tolerance(jpdata[:, :, 1], pgxdata) < 4) + self.assertTrue(mse(jpdata[:, :, 1], pgxdata) < 0.626) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p0_04_2.pgx') + pgxdata = read_pgx(pgxfile) + self.assertTrue(peak_tolerance(jpdata[:, :, 2], pgxdata) < 6) + self.assertTrue(mse(jpdata[:, :, 2], pgxdata) < 1.07) + + def test_ETS_C1P0_p0_05_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p0_05.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read_bands() + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p0_05_0.pgx') + pgxdata = read_pgx(pgxfile) + self.assertTrue(peak_tolerance(jpdata[0], pgxdata) < 2) + self.assertTrue(mse(jpdata[0], pgxdata) < 0.302) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p0_05_1.pgx') + pgxdata = read_pgx(pgxfile) + self.assertTrue(peak_tolerance(jpdata[1], pgxdata) < 2) + self.assertTrue(mse(jpdata[1], pgxdata) < 0.307) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p0_05_2.pgx') + pgxdata = read_pgx(pgxfile) + self.assertTrue(peak_tolerance(jpdata[2], pgxdata) < 2) + self.assertTrue(mse(jpdata[2], pgxdata) < 0.269) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p0_05_3.pgx') + pgxdata = read_pgx(pgxfile) + self.assertTrue(peak_tolerance(jpdata[3], pgxdata) == 0) + self.assertTrue(mse(jpdata[3], pgxdata) == 0) + + def test_ETS_C1P0_p0_06_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p0_06.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read_bands() + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p0_06_0.pgx') + pgxdata = read_pgx(pgxfile) + self.assertTrue(peak_tolerance(jpdata[0], pgxdata) < 635) + self.assertTrue(mse(jpdata[0], pgxdata) < 11287) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p0_06_1.pgx') + pgxdata = read_pgx(pgxfile) + self.assertTrue(peak_tolerance(jpdata[1], pgxdata) < 403) + self.assertTrue(mse(jpdata[1], pgxdata) < 6124) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p0_06_2.pgx') + pgxdata = read_pgx(pgxfile) + self.assertTrue(peak_tolerance(jpdata[2], pgxdata) < 378) + self.assertTrue(mse(jpdata[2], pgxdata) < 3968) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p0_06_3.pgx') + pgxdata = read_pgx(pgxfile) + self.assertTrue(peak_tolerance(jpdata[3], pgxdata) == 0) + self.assertTrue(mse(jpdata[3], pgxdata) == 0) + + @unittest.skip("Known failure in OPENJPEG test suite operation.") + def test_ETS_C1P0_p0_07_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p0_07.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read() + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p0_07_0.pgx') + pgxdata = read_pgx(pgxfile) + np.testing.assert_array_equal(jpdata[:, :, 0], pgxdata) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p0_07_1.pgx') + pgxdata = read_pgx(pgxfile) + np.testing.assert_array_equal(jpdata[:, : 1], pgxdata) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p0_07_2.pgx') + pgxdata = read_pgx(pgxfile) + np.testing.assert_array_equal(jpdata[:, : 2], pgxdata) + + def test_ETS_C1P0_p0_08_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p0_08.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=1) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p0_08_0.pgx') + pgxdata = read_pgx(pgxfile) + np.testing.assert_array_equal(jpdata[:, :, 0], pgxdata) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p0_08_1.pgx') + pgxdata = read_pgx(pgxfile) + np.testing.assert_array_equal(jpdata[:, :, 1], pgxdata) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p0_08_2.pgx') + pgxdata = read_pgx(pgxfile) + np.testing.assert_array_equal(jpdata[:, :, 2], pgxdata) + + def test_ETS_C1P0_p0_09_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p0_09.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=0) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p0_09_0.pgx') + pgxdata = read_pgx(pgxfile) + np.testing.assert_array_equal(jpdata, pgxdata) + + def test_ETS_C1P0_p0_10_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p0_10.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=0) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p0_10_0.pgx') + pgxdata = read_pgx(pgxfile) + np.testing.assert_array_equal(jpdata[:, :, 0], pgxdata) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p0_10_1.pgx') + pgxdata = read_pgx(pgxfile) + np.testing.assert_array_equal(jpdata[:, :, 1], pgxdata) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p0_10_2.pgx') + pgxdata = read_pgx(pgxfile) + np.testing.assert_array_equal(jpdata[:, :, 2], pgxdata) + + def test_ETS_C1P0_p0_11_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p0_11.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=0) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p0_11_0.pgx') + pgxdata = read_pgx(pgxfile) + np.testing.assert_array_equal(jpdata, pgxdata) + + def test_ETS_C1P0_p0_12_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p0_12.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=0) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p0_12_0.pgx') + pgxdata = read_pgx(pgxfile) + np.testing.assert_array_equal(jpdata, pgxdata) + + def test_ETS_C1P0_p0_13_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p0_13.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=0) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p0_13_0.pgx') + pgxdata = read_pgx(pgxfile) + np.testing.assert_array_equal(jpdata[:, :, 0], pgxdata) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p0_13_1.pgx') + pgxdata = read_pgx(pgxfile) + np.testing.assert_array_equal(jpdata[:, :, 1], pgxdata) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p0_13_2.pgx') + pgxdata = read_pgx(pgxfile) + np.testing.assert_array_equal(jpdata[:, :, 2], pgxdata) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p0_13_3.pgx') + pgxdata = read_pgx(pgxfile) + np.testing.assert_array_equal(jpdata[:, :, 3], pgxdata) + + def test_ETS_C1P0_p0_14_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p0_14.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=0) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p0_14_0.pgx') + pgxdata = read_pgx(pgxfile) + np.testing.assert_array_equal(jpdata[:, :, 0], pgxdata) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p0_14_1.pgx') + pgxdata = read_pgx(pgxfile) + np.testing.assert_array_equal(jpdata[:, :, 1], pgxdata) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p0_14_2.pgx') + pgxdata = read_pgx(pgxfile) + np.testing.assert_array_equal(jpdata[:, :, 2], pgxdata) + + def test_ETS_C1P0_p0_15_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p0_15.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=0) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p0_15_0.pgx') + pgxdata = read_pgx(pgxfile) + np.testing.assert_array_equal(jpdata, pgxdata) + + def test_ETS_C1P0_p0_16_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p0_16.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=0) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p0_16_0.pgx') + pgxdata = read_pgx(pgxfile) + np.testing.assert_array_equal(jpdata, pgxdata) + + def test_ETS_C1P1_p1_01_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p1_01.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=0) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p1_01_0.pgx') + pgxdata = read_pgx(pgxfile) + np.testing.assert_array_equal(jpdata, pgxdata) + + def test_ETS_C1P1_p1_02_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p1_02.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read(reduce=0) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p1_02_0.pgx') + pgxdata = read_pgx(pgxfile) + self.assertTrue(peak_tolerance(jpdata[:, :, 0], pgxdata) < 5) + self.assertTrue(mse(jpdata[:, :, 0], pgxdata) < 0.765) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p1_02_1.pgx') + pgxdata = read_pgx(pgxfile) + self.assertTrue(peak_tolerance(jpdata[:, :, 1], pgxdata) < 4) + self.assertTrue(mse(jpdata[:, :, 1], pgxdata) < 0.616) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p1_02_2.pgx') + pgxdata = read_pgx(pgxfile) + self.assertTrue(peak_tolerance(jpdata[:, :, 2], pgxdata) < 6) + self.assertTrue(mse(jpdata[:, :, 2], pgxdata) < 1.051) + + def test_ETS_C1P1_p1_03_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p1_03.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read_bands() + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p1_03_0.pgx') + pgxdata = read_pgx(pgxfile) + self.assertTrue(peak_tolerance(jpdata[0], pgxdata) < 2) + self.assertTrue(mse(jpdata[0], pgxdata) < 0.3) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p1_03_1.pgx') + pgxdata = read_pgx(pgxfile) + self.assertTrue(peak_tolerance(jpdata[1], pgxdata) < 2) + self.assertTrue(mse(jpdata[1], pgxdata) < 0.21) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p1_03_2.pgx') + pgxdata = read_pgx(pgxfile) + self.assertTrue(peak_tolerance(jpdata[2], pgxdata) <= 1) + self.assertTrue(mse(jpdata[2], pgxdata) < 0.2) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p1_03_3.pgx') + pgxdata = read_pgx(pgxfile) + np.testing.assert_array_equal(jpdata[3], pgxdata) + + def test_ETS_C1P1_p1_04_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p1_04.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read() + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p1_04_0.pgx') + pgxdata = read_pgx(pgxfile) + self.assertTrue(peak_tolerance(jpdata, pgxdata) < 624) + self.assertTrue(mse(jpdata, pgxdata) < 3080) + + def test_ETS_C1P1_p1_05_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p1_05.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read() + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p1_05_0.pgx') + pgxdata = read_pgx(pgxfile) + self.assertTrue(peak_tolerance(jpdata[:, :, 0], pgxdata) < 40) + self.assertTrue(mse(jpdata[:, :, 0], pgxdata) < 8.458) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p1_05_1.pgx') + pgxdata = read_pgx(pgxfile) + self.assertTrue(peak_tolerance(jpdata[:, :, 1], pgxdata) < 40) + self.assertTrue(mse(jpdata[:, :, 1], pgxdata) < 9.816) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p1_05_2.pgx') + pgxdata = read_pgx(pgxfile) + self.assertTrue(peak_tolerance(jpdata[:, :, 2], pgxdata) < 40) + self.assertTrue(mse(jpdata[:, :, 2], pgxdata) < 10.154) + + def test_ETS_C1P1_p1_06_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p1_06.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read() + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p1_06_0.pgx') + pgxdata = read_pgx(pgxfile) + self.assertTrue(peak_tolerance(jpdata[:, :, 0], pgxdata) < 2) + self.assertTrue(mse(jpdata[:, :, 0], pgxdata) < 0.6) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p1_06_1.pgx') + pgxdata = read_pgx(pgxfile) + self.assertTrue(peak_tolerance(jpdata[:, :, 1], pgxdata) < 2) + self.assertTrue(mse(jpdata[:, :, 1], pgxdata) < 0.6) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p1_06_2.pgx') + pgxdata = read_pgx(pgxfile) + self.assertTrue(peak_tolerance(jpdata[:, :, 2], pgxdata) < 2) + self.assertTrue(mse(jpdata[:, :, 2], pgxdata) < 0.6) + + def test_ETS_C1P1_p1_07_j2k(self): + jfile = os.path.join(data_root, 'input/conformance/p1_07.j2k') + jp2k = Jp2k(jfile) + jpdata = jp2k.read_bands() + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p1_07_0.pgx') + pgxdata = read_pgx(pgxfile) + self.assertTrue(peak_tolerance(jpdata[0], pgxdata) <= 0) + self.assertTrue(mse(jpdata[0], pgxdata) <= 0) + + pgxfile = os.path.join(data_root, 'baseline/conformance/c1p1_07_1.pgx') + pgxdata = read_pgx(pgxfile) + self.assertTrue(peak_tolerance(jpdata[1], pgxdata) <= 0) + self.assertTrue(mse(jpdata[1], pgxdata) <= 0) + + def test_ETS_JP2_file1(self): + jfile = os.path.join(data_root, 'input/conformance/file1.jp2') + jp2k = Jp2k(jfile) + jpdata = jp2k.read() + self.assertEqual(jpdata.shape, (512, 768, 3)) + + def test_ETS_JP2_file2(self): + jfile = os.path.join(data_root, 'input/conformance/file2.jp2') + jp2k = Jp2k(jfile) + jpdata = jp2k.read() + self.assertEqual(jpdata.shape, (640, 480, 3)) + + def test_ETS_JP2_file3(self): + jfile = os.path.join(data_root, 'input/conformance/file3.jp2') + jp2k = Jp2k(jfile) + jpdata = jp2k.read_bands() + self.assertEqual(jpdata[0].shape, (640, 480)) + self.assertEqual(jpdata[1].shape, (320, 240)) + self.assertEqual(jpdata[2].shape, (320, 240)) + + def test_ETS_JP2_file4(self): + jfile = os.path.join(data_root, 'input/conformance/file4.jp2') + jp2k = Jp2k(jfile) + jpdata = jp2k.read() + self.assertEqual(jpdata.shape, (512, 768)) + + def test_ETS_JP2_file5(self): + jfile = os.path.join(data_root, 'input/conformance/file5.jp2') + jp2k = Jp2k(jfile) + jpdata = jp2k.read() + self.assertEqual(jpdata.shape, (512, 768, 3)) + + def test_ETS_JP2_file6(self): + jfile = os.path.join(data_root, 'input/conformance/file6.jp2') + jp2k = Jp2k(jfile) + jpdata = jp2k.read() + self.assertEqual(jpdata.shape, (512, 768)) + + def test_ETS_JP2_file7(self): + jfile = os.path.join(data_root, 'input/conformance/file7.jp2') + jp2k = Jp2k(jfile) + jpdata = jp2k.read() + self.assertEqual(jpdata.shape, (640, 480, 3)) + + def test_ETS_JP2_file8(self): + jfile = os.path.join(data_root, 'input/conformance/file8.jp2') + jp2k = Jp2k(jfile) + jpdata = jp2k.read() + self.assertEqual(jpdata.shape, (400, 700)) + + def test_ETS_JP2_file9(self): + jfile = os.path.join(data_root, 'input/conformance/file9.jp2') + jp2k = Jp2k(jfile) + jpdata = jp2k.read() + self.assertEqual(jpdata.shape, (512, 768, 3)) + + def test_NR_p0_01_dump(self): + jfile = os.path.join(data_root, 'input/conformance/p0_01.j2k') + c = Jp2k(jfile).get_codestream(header_only=False) + + # Segment IDs. + actual = [x.id for x in c.segment] + expected = ['SOC', 'SIZ', 'QCD', 'COD', 'SOT', 'SOD', 'EOC'] + self.assertEqual(actual, expected) + + # SIZ: Image and tile size + # Profile: "1" means profile 0 + self.assertEqual(c.segment[1].Rsiz, 1) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 128) + self.assertEqual(c.segment[1].Ysiz, 128) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (128, 128)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8,)) + # signed + self.assertEqual(c.segment[1]._signed, (False,)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)]) + + # QCD: Quantization default + self.assertEqual(c.segment[2].Sqcd & 0x1f, 0) + self.assertEqual(c.segment[2]._guardBits, 2) + self.assertEqual(c.segment[2]._exponent, + [8, 9, 9, 10, 9, 9, 10, 9, 9, 10]) + self.assertEqual(c.segment[2]._mantissa, + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) + + # COD: Coding style default + self.assertFalse(c.segment[3].Scod & 2) # no sop + self.assertFalse(c.segment[3].Scod & 4) # no eph + self.assertEqual(c.segment[3].SPcod[0], glymur.core.RLCP) + self.assertEqual(c.segment[3]._layers, 1) # layers = 1 + self.assertEqual(c.segment[3].SPcod[3], 0) # mct + self.assertEqual(c.segment[3].SPcod[4], 3) # layers + self.assertEqual(tuple(c.segment[3]._code_block_size), + (64, 64)) # cblk + # Selective arithmetic coding bypass + self.assertFalse(c.segment[3].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[3].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[3].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[3].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[3].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[3].SPcod[7] & 0x0020) + self.assertEqual(c.segment[3].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + + # SOT: start of tile part + self.assertEqual(c.segment[4].Isot, 0) + self.assertEqual(c.segment[4].Psot, 7314) + self.assertEqual(c.segment[4].TPsot, 0) + self.assertEqual(c.segment[4].TNsot, 1) + + def test_NR_p0_02_dump(self): + jfile = os.path.join(data_root, 'input/conformance/p0_02.j2k') + c = Jp2k(jfile).get_codestream(header_only=False) + + # SIZ: Image and tile size + # Profile: "1" means profile 0 + self.assertEqual(c.segment[1].Rsiz, 1) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 127) + self.assertEqual(c.segment[1].Ysiz, 126) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (127, 126)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8,)) + # signed + self.assertEqual(c.segment[1]._signed, (False,)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(2, 1)]) + + # COD: Coding style default + self.assertTrue(c.segment[2].Scod & 2) # sop + self.assertTrue(c.segment[2].Scod & 4) # eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 6) # layers = 6 + self.assertEqual(c.segment[2].SPcod[3], 0) # mct + self.assertEqual(c.segment[2].SPcod[4], 3) # levels + self.assertEqual(tuple(c.segment[2]._code_block_size), + (64, 64)) # cblk + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertTrue(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertTrue(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertTrue(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE) + + # COC: Coding style component + self.assertEqual(c.segment[3].Ccoc, 0) + self.assertEqual(c.segment[3].SPcoc[0], 3) # levels + self.assertEqual(tuple(c.segment[3]._code_block_size), + (32, 32)) # cblk + # Selective arithmetic coding bypass + self.assertFalse(c.segment[3].SPcoc[3] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[3].SPcoc[3] & 0x02) + # Termination on each coding pass + self.assertTrue(c.segment[3].SPcoc[3] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[3].SPcoc[3] & 0x08) + # Predictable termination + self.assertTrue(c.segment[3].SPcoc[3] & 0x0010) + # Segmentation symbols + self.assertTrue(c.segment[3].SPcoc[3] & 0x0020) + self.assertEqual(c.segment[3].SPcoc[4], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + + # QCD: Quantization default + # quantization type + self.assertEqual(c.segment[4].Sqcd & 0x1f, 0) # none + self.assertEqual(c.segment[4]._guardBits, 3) + self.assertEqual(c.segment[4]._exponent, + [8, 9, 9, 10, 9, 9, 10, 9, 9, 10]) + self.assertEqual(c.segment[4]._mantissa, + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) + + # COM: comment + # Registration + self.assertEqual(c.segment[5].Rcme, glymur.core.RCME_ISO_8859_1) + # Comment value + self.assertEqual(c.segment[5].Ccme.decode('latin-1'), + "Creator: AV-J2K (c) 2000,2001 Algo Vision") + + # One unknown marker + self.assertEqual(c.segment[6].id, '0xff30') + + # SOT: start of tile part + self.assertEqual(c.segment[7].Isot, 0) + self.assertEqual(c.segment[7].Psot, 6047) + self.assertEqual(c.segment[7].TPsot, 0) + self.assertEqual(c.segment[7].TNsot, 1) + + # SOD: start of data + # Just one. + self.assertEqual(c.segment[8].id, 'SOD') + + # SOP, EPH + sop = [x.id for x in c.segment if x.id == 'SOP'] + eph = [x.id for x in c.segment if x.id == 'EPH'] + self.assertEqual(len(sop), 24) + self.assertEqual(len(eph), 24) + + # EOC: end of codestream + self.assertEqual(c.segment[-1].id, 'EOC') + + def test_NR_p0_03_dump(self): + jfile = os.path.join(data_root, 'input/conformance/p0_03.j2k') + c = Jp2k(jfile).get_codestream(header_only=False) + + # SIZ: Image and tile size + # Profile: "1" means profile 0 + self.assertEqual(c.segment[1].Rsiz, 1) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 256) + self.assertEqual(c.segment[1].Ysiz, 256) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (128, 128)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (4,)) + # signed + self.assertEqual(c.segment[1]._signed, (True,)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)]) + + # COD: Coding style default + self.assertTrue(c.segment[2].Scod & 2) + self.assertFalse(c.segment[2].Scod & 4) + self.assertEqual(c.segment[2].SPcod[0], glymur.core.PCRL) + self.assertEqual(c.segment[2]._layers, 8) # 8 + self.assertEqual(c.segment[2].SPcod[3], 0) # mct + self.assertEqual(c.segment[2].SPcod[4], 1) # levels + self.assertEqual(tuple(c.segment[2]._code_block_size), + (64, 64)) # cblk + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + + # QCD: Quantization default + # quantization type + self.assertEqual(c.segment[3].Sqcd & 0x1f, 1) # scalar implicit + self.assertEqual(c.segment[3]._guardBits, 2) + self.assertEqual(c.segment[3]._exponent, [0]) + self.assertEqual(c.segment[3]._mantissa, [0]) + + # QCC: Quantization component + # associated component + self.assertEqual(c.segment[4].Cqcc, 0) + self.assertEqual(c.segment[4]._guardBits, 2) + # quantization type + self.assertEqual(c.segment[4].Sqcc & 0x1f, 0) # none + self.assertEqual(c.segment[4]._exponent, [4, 5, 5, 6]) + self.assertEqual(c.segment[4]._mantissa, [0, 0, 0, 0]) + + # POD: progression order change + self.assertEqual(c.segment[5].RSpod, (0,)) + self.assertEqual(c.segment[5].CSpod, (0,)) + self.assertEqual(c.segment[5].LYEpod, (8,)) + self.assertEqual(c.segment[5].REpod, (33,)) + self.assertEqual(c.segment[5].CEpod, (255,)) + self.assertEqual(c.segment[5].Ppod, (glymur.core.LRCP,)) + + # CRG: component registration + self.assertEqual(c.segment[6].Xcrg, (65424,)) + self.assertEqual(c.segment[6].Ycrg, (32558,)) + + # COM: comment + # Registration + self.assertEqual(c.segment[7].Rcme, glymur.core.RCME_ISO_8859_1) + # Comment value + self.assertEqual(c.segment[7].Ccme.decode('latin-1'), + "Creator: AV-J2K (c) 2000,2001 Algo Vision") + + # COM: comment + # Registration + self.assertEqual(c.segment[8].Rcme, glymur.core.RCME_ISO_8859_1) + # Comment value + self.assertEqual(c.segment[8].Ccme.decode('latin-1'), + "Creator: AV-J2K (c) 2000," + + "2001 Algo Vision Technology") + + # COM: comment + # Registration + self.assertEqual(c.segment[9].Rcme, glymur.core.RCME_BINARY) + # Comment value + self.assertEqual(len(c.segment[9].Ccme), 62) + + # TLM (tile-part length) + self.assertEqual(c.segment[10].Ztlm, 0) + self.assertEqual(c.segment[10].Ttlm, (0, 1, 2, 3)) + self.assertEqual(c.segment[10].Ptlm, (4267, 2117, 4080, 2081)) + + # SOT: start of tile part + self.assertEqual(c.segment[11].Isot, 0) + self.assertEqual(c.segment[11].Psot, 4267) + self.assertEqual(c.segment[11].TPsot, 0) + self.assertEqual(c.segment[11].TNsot, 1) + + # RGN: region of interest + self.assertEqual(c.segment[12].Crgn, 0) + self.assertEqual(c.segment[12].Srgn, 0) + self.assertEqual(c.segment[12].SPrgn, 7) + + # SOD: start of data + # Just one. + self.assertEqual(c.segment[13].id, 'SOD') + + def test_NR_p0_04_dump(self): + jfile = os.path.join(data_root, 'input/conformance/p0_04.j2k') + c = Jp2k(jfile).get_codestream(header_only=False) + + # SIZ: Image and tile size + # Profile: "1" means profile 0 + self.assertEqual(c.segment[1].Rsiz, 1) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 640) + self.assertEqual(c.segment[1].Ysiz, 480) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (640, 480)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8, 8, 8)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1), (1, 1), (1, 1)]) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) + self.assertFalse(c.segment[2].Scod & 4) + self.assertEqual(c.segment[2].SPcod[0], glymur.core.RLCP) + self.assertEqual(c.segment[2]._layers, 20) # 20 + self.assertEqual(c.segment[2].SPcod[3], 1) # mct + self.assertEqual(c.segment[2].SPcod[4], 6) # levels + self.assertEqual(tuple(c.segment[2]._code_block_size), + (64, 64)) # cblk + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertTrue(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE) + self.assertEqual(c.segment[2]._precinct_size, + [(128, 128), (128, 128), (128, 128), (128, 128), + (128, 128), (128, 128), (128, 128)]) + + # QCD: Quantization default + # quantization type + self.assertEqual(c.segment[3].Sqcd & 0x1f, 2) # scalar expounded + self.assertEqual(c.segment[3]._guardBits, 3) + self.assertEqual(c.segment[3]._exponent, + [16, 16, 16, 16, 15, 15, 15, 14, 14, 14, 13, 13, 13, + 11, 11, 11, 11, 11, 11]) + self.assertEqual(c.segment[3]._mantissa, + [1814, 1815, 1815, 1817, 1821, 1821, 1827, 1845, 1845, + 1868, 1925, 1925, 2007, 32, 32, 131, 2002, 2002, + 1888]) + + # QCC: Quantization component + # associated component + self.assertEqual(c.segment[4].Cqcc, 1) + # quantization type + self.assertEqual(c.segment[4].Sqcc & 0x1f, 2) # none + self.assertEqual(c.segment[4]._guardBits, 3) + self.assertEqual(c.segment[4]._exponent, + [14, 14, 14, 14, 13, 13, 13, 12, 12, 12, 11, 11, 11, + 9, 9, 9, 9, 9, 9]) + self.assertEqual(c.segment[4]._mantissa, + [1814, 1815, 1815, 1817, 1821, 1821, 1827, 1845, + 1845, 1868, 1925, 1925, 2007, 32, 32, 131, 2002, + 2002, 1888]) + + # QCC: Quantization component + # associated component + self.assertEqual(c.segment[5].Cqcc, 2) + # quantization type + self.assertEqual(c.segment[5].Sqcc & 0x1f, 2) # none + self.assertEqual(c.segment[5]._guardBits, 3) + self.assertEqual(c.segment[5]._exponent, + [14, 14, 14, 14, 13, 13, 13, 12, 12, 12, 11, 11, 11, + 9, 9, 9, 9, 9, 9]) + self.assertEqual(c.segment[5]._mantissa, + [1814, 1815, 1815, 1817, 1821, 1821, 1827, 1845, + 1845, 1868, 1925, 1925, 2007, 32, 32, 131, 2002, + 2002, 1888]) + + # COM: comment + # Registration + self.assertEqual(c.segment[6].Rcme, glymur.core.RCME_ISO_8859_1) + # Comment value + self.assertEqual(c.segment[6].Ccme.decode('latin-1'), + "Creator: AV-J2K (c) 2000,2001 Algo Vision") + + # SOT: start of tile part + self.assertEqual(c.segment[7].Isot, 0) + self.assertEqual(c.segment[7].Psot, 264383) + self.assertEqual(c.segment[7].TPsot, 0) + self.assertEqual(c.segment[7].TNsot, 1) + + # SOD: start of data + # Just one. + self.assertEqual(c.segment[8].id, 'SOD') + + def test_NR_p0_05_dump(self): + jfile = os.path.join(data_root, 'input/conformance/p0_05.j2k') + c = Jp2k(jfile).get_codestream(header_only=False) + + # SIZ: Image and tile size + # Profile: "1" means profile 0 + self.assertEqual(c.segment[1].Rsiz, 1) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 1024) + self.assertEqual(c.segment[1].Ysiz, 1024) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), + (1024, 1024)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8, 8, 8, 8)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False, False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1), (1, 1), (2, 2), (2, 2)]) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) + self.assertFalse(c.segment[2].Scod & 4) + self.assertEqual(c.segment[2].SPcod[0], glymur.core.PCRL) + self.assertEqual(c.segment[2]._layers, 7) # 7 + self.assertEqual(c.segment[2].SPcod[3], 0) # mct + self.assertEqual(c.segment[2].SPcod[4], 6) # levels + self.assertEqual(tuple(c.segment[2]._code_block_size), + (32, 32)) # cblk + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # COC: Coding style component + self.assertEqual(c.segment[3].Ccoc, 1) + self.assertEqual(c.segment[3].SPcoc[0], 3) # levels + self.assertEqual(tuple(c.segment[3]._code_block_size), + (32, 32)) # cblk + # Selective arithmetic coding bypass + self.assertFalse(c.segment[3].SPcoc[3] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[3].SPcoc[3] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[3].SPcoc[3] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[3].SPcoc[3] & 0x08) + # Predictable termination + self.assertFalse(c.segment[3].SPcoc[3] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[3].SPcoc[3] & 0x0020) + self.assertEqual(c.segment[3].SPcoc[4], + glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE) + + # COC: Coding style component + self.assertEqual(c.segment[4].Ccoc, 3) + self.assertEqual(c.segment[4].SPcoc[0], 6) # levels + self.assertEqual(tuple(c.segment[4]._code_block_size), + (32, 32)) # cblk + # Selective arithmetic coding bypass + self.assertFalse(c.segment[4].SPcoc[3] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[4].SPcoc[3] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[4].SPcoc[3] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[4].SPcoc[3] & 0x08) + # Predictable termination + self.assertFalse(c.segment[4].SPcoc[3] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[4].SPcoc[3] & 0x0020) + self.assertEqual(c.segment[4].SPcoc[4], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + + # QCD: Quantization default + # quantization type + self.assertEqual(c.segment[5].Sqcd & 0x1f, 2) # scalar expounded + self.assertEqual(c.segment[5]._guardBits, 3) + self.assertEqual(c.segment[5]._exponent, + [16, 16, 16, 16, 15, 15, 15, 14, 14, 14, 13, 13, 13, + 11, 11, 11, 11, 11, 11]) + self.assertEqual(c.segment[5]._mantissa, + [1814, 1815, 1815, 1817, 1821, 1821, 1827, 1845, + 1845, 1868, 1925, 1925, 2007, 32, 32, 131, 2002, + 2002, 1888]) + + # QCC: Quantization component + # associated component + self.assertEqual(c.segment[6].Cqcc, 0) + # quantization type + self.assertEqual(c.segment[6].Sqcc & 0x1f, 1) # scalar derived + self.assertEqual(c.segment[6]._guardBits, 3) + self.assertEqual(c.segment[6]._exponent, [14]) + self.assertEqual(c.segment[6]._mantissa, [0]) + + # QCC: Quantization component + # associated component + self.assertEqual(c.segment[7].Cqcc, 3) + # quantization type + self.assertEqual(c.segment[7].Sqcc & 0x1f, 0) # none + self.assertEqual(c.segment[7]._guardBits, 3) + self.assertEqual(c.segment[7]._exponent, + [8, 9, 9, 10, 9, 9, 10, 9, 9, 10, 9, 9, 10, 9, 9, 10, + 9, 9, 10]) + self.assertEqual(c.segment[7]._mantissa, [0] * 19) + + # COM: comment + # Registration + self.assertEqual(c.segment[8].Rcme, glymur.core.RCME_ISO_8859_1) + # Comment value + self.assertEqual(c.segment[8].Ccme.decode('latin-1'), + "Creator: AV-J2K (c) 2000,2001 Algo Vision") + + # TLM (tile-part length) + self.assertEqual(c.segment[9].Ztlm, 0) + self.assertEqual(c.segment[9].Ttlm, (0,)) + self.assertEqual(c.segment[9].Ptlm, (1310540,)) + + # SOT: start of tile part + self.assertEqual(c.segment[10].Isot, 0) + self.assertEqual(c.segment[10].Psot, 1310540) + self.assertEqual(c.segment[10].TPsot, 0) + self.assertEqual(c.segment[10].TNsot, 1) + + # SOD: start of data + # Just one. + self.assertEqual(c.segment[11].id, 'SOD') + + def test_NR_p0_06_dump(self): + jfile = os.path.join(data_root, 'input/conformance/p0_06.j2k') + c = Jp2k(jfile).get_codestream(header_only=False) + + # SIZ: Image and tile size + # Profile: "1" means profile 0 + self.assertEqual(c.segment[1].Rsiz, 2) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 513) + self.assertEqual(c.segment[1].Ysiz, 129) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (513, 129)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (12, 12, 12, 12)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False, False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1), (2, 1), (1, 2), (2, 2)]) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) + self.assertFalse(c.segment[2].Scod & 4) + self.assertEqual(c.segment[2].SPcod[0], glymur.core.RPCL) + self.assertEqual(c.segment[2]._layers, 4) # 4 + self.assertEqual(c.segment[2].SPcod[3], 0) # mct + self.assertEqual(c.segment[2].SPcod[4], 6) # levels + self.assertEqual(tuple(c.segment[2]._code_block_size), + (64, 64)) # cblk + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + # quantization type + self.assertEqual(c.segment[3].Sqcd & 0x1f, 2) # scalar expounded + self.assertEqual(c.segment[3]._guardBits, 3) + self.assertEqual(c.segment[3]._mantissa, + [512, 518, 522, 524, 516, 524, 522, 527, 523, 549, + 557, 561, 853, 852, 700, 163, 78, 1508, 1831]) + self.assertEqual(c.segment[3]._exponent, + [7, 7, 7, 7, 6, 6, 6, 5, 5, 5, 4, 4, 4, 3, 3, 2, 1, 2, + 1]) + + # QCC: Quantization component + # associated component + self.assertEqual(c.segment[4].Cqcc, 1) + # quantization type + self.assertEqual(c.segment[4].Sqcc & 0x1f, 2) # scalar derived + self.assertEqual(c.segment[4]._guardBits, 4) + self.assertEqual(c.segment[4]._mantissa, + [1527, 489, 665, 506, 487, 502, 493, 493, 500, 485, + 505, 491, 490, 491, 499, 509, 503, 496, 558]) + self.assertEqual(c.segment[4]._exponent, + [10, 10, 10, 10, 9, 9, 9, 8, 8, 8, 7, 7, 7, 6, 6, 6, + 5, 5, 5]) + + # QCC: Quantization component + # associated component + self.assertEqual(c.segment[5].Cqcc, 2) + # quantization type + self.assertEqual(c.segment[5].Sqcc & 0x1f, 2) # scalar derived + self.assertEqual(c.segment[5]._guardBits, 5) + self.assertEqual(c.segment[5]._mantissa, + [1337, 728, 890, 719, 716, 726, 700, 718, 704, 704, + 712, 712, 717, 719, 701, 749, 753, 718, 841]) + self.assertEqual(c.segment[5]._exponent, + [10, 10, 10, 10, 9, 9, 9, 8, 8, 8, 7, 7, 7, 6, 6, 6, + 5, 5, 5]) + + # QCC: Quantization component + # associated component + self.assertEqual(c.segment[6].Cqcc, 3) + # quantization type + self.assertEqual(c.segment[6].Sqcc & 0x1f, 0) # none + self.assertEqual(c.segment[6]._guardBits, 6) + self.assertEqual(c.segment[6]._mantissa, [0] * 19) + self.assertEqual(c.segment[6]._exponent, + [12, 13, 13, 14, 13, 13, 14, 13, 13, 14, 13, 13, 14, + 13, 13, 14, 13, 13, 14]) + + # COC: Coding style component + self.assertEqual(c.segment[7].Ccoc, 3) + self.assertEqual(c.segment[7].SPcoc[0], 6) # levels + self.assertEqual(tuple(c.segment[7]._code_block_size), + (64, 64)) # cblk + # Selective arithmetic coding bypass + self.assertFalse(c.segment[7].SPcoc[3] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[7].SPcoc[3] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[7].SPcoc[3] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[7].SPcoc[3] & 0x08) + # Predictable termination + self.assertFalse(c.segment[7].SPcoc[3] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[7].SPcoc[3] & 0x0020) + self.assertEqual(c.segment[7].SPcoc[4], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + + # RGN: region of interest + self.assertEqual(c.segment[8].Crgn, 0) # component + self.assertEqual(c.segment[8].Srgn, 0) # implicit + self.assertEqual(c.segment[8].SPrgn, 11) + + # SOT: start of tile part + self.assertEqual(c.segment[9].Isot, 0) + self.assertEqual(c.segment[9].Psot, 33582) + self.assertEqual(c.segment[9].TPsot, 0) + self.assertEqual(c.segment[9].TNsot, 1) + + # RGN: region of interest + self.assertEqual(c.segment[10].Crgn, 0) # component + self.assertEqual(c.segment[10].Srgn, 0) # implicit + self.assertEqual(c.segment[10].SPrgn, 9) + + # SOD: start of data + # Just one. + self.assertEqual(c.segment[11].id, 'SOD') + + def test_NR_p0_07_dump(self): + jfile = os.path.join(data_root, 'input/conformance/p0_07.j2k') + c = Jp2k(jfile).get_codestream(header_only=False) + + # SIZ: Image and tile size + # Profile: "1" means profile 0 + self.assertEqual(c.segment[1].Rsiz, 1) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 2048) + self.assertEqual(c.segment[1].Ysiz, 2048) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (128, 128)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (12, 12, 12)) + # signed + self.assertEqual(c.segment[1]._signed, (True, True, True)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1), (1, 1), (1, 1)]) + + # COD: Coding style default + self.assertTrue(c.segment[2].Scod & 2) + self.assertTrue(c.segment[2].Scod & 4) + self.assertEqual(c.segment[2].SPcod[0], glymur.core.RLCP) + self.assertEqual(c.segment[2]._layers, 8) # 8 + self.assertEqual(c.segment[2].SPcod[3], 0) # mct + self.assertEqual(c.segment[2].SPcod[4], 3) # levels + self.assertEqual(tuple(c.segment[2]._code_block_size), + (64, 64)) # cblk + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + # quantization type + self.assertEqual(c.segment[3].Sqcd & 0x1f, 0) # none + self.assertEqual(c.segment[3]._guardBits, 1) + self.assertEqual(c.segment[3]._mantissa, [0] * 10) + self.assertEqual(c.segment[3]._exponent, + [14, 15, 15, 16, 15, 15, 16, 15, 15, 16]) + + # COM: comment + # Registration + self.assertEqual(c.segment[4].Rcme, glymur.core.RCME_ISO_8859_1) + # Comment value + self.assertEqual(c.segment[4].Ccme.decode('latin-1'), + "Kakadu-3.0.7") + + # SOT: start of tile part + self.assertEqual(c.segment[5].Isot, 0) + self.assertEqual(c.segment[5].Psot, 9951) + self.assertEqual(c.segment[5].TPsot, 0) + self.assertEqual(c.segment[5].TNsot, 0) # unknown + + # POD: progression order change + self.assertEqual(c.segment[6].RSpod, (0,)) + self.assertEqual(c.segment[6].CSpod, (0,)) + self.assertEqual(c.segment[6].LYEpod, (9,)) + self.assertEqual(c.segment[6].REpod, (3,)) + self.assertEqual(c.segment[6].CEpod, (3,)) + self.assertEqual(c.segment[6].Ppod, (glymur.core.LRCP,)) + + # PLT: packet length, tile part + self.assertEqual(c.segment[7].Zplt, 0) + #self.assertEqual(c.segment[7].iplt), 99) + + # SOD: start of data + self.assertEqual(c.segment[8].id, 'SOD') + + def test_NR_p0_08_dump(self): + jfile = os.path.join(data_root, 'input/conformance/p0_08.j2k') + c = Jp2k(jfile).get_codestream(header_only=False) + + # SIZ: Image and tile size + # Profile: "1" means profile 0 + self.assertEqual(c.segment[1].Rsiz, 1) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 513) + self.assertEqual(c.segment[1].Ysiz, 3072) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (513, 3072)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (12, 12, 12)) + # signed + self.assertEqual(c.segment[1]._signed, (True, True, True)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1), (1, 1), (1, 1)]) + + # COD: Coding style default + self.assertTrue(c.segment[2].Scod & 2) + self.assertTrue(c.segment[2].Scod & 4) + self.assertEqual(c.segment[2].SPcod[0], glymur.core.CPRL) + self.assertEqual(c.segment[2]._layers, 30) # 30 + self.assertEqual(c.segment[2].SPcod[3], 0) # mct + self.assertEqual(c.segment[2].SPcod[4], 7) # levels + self.assertEqual(tuple(c.segment[2]._code_block_size), + (64, 64)) # cblk + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # COC: Coding style component + self.assertEqual(c.segment[3].Ccoc, 0) + self.assertEqual(c.segment[3].SPcoc[0], 6) # levels + self.assertEqual(tuple(c.segment[3]._code_block_size), + (64, 64)) # cblk + # Selective arithmetic coding bypass + self.assertFalse(c.segment[3].SPcoc[3] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[3].SPcoc[3] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[3].SPcoc[3] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[3].SPcoc[3] & 0x08) + # Predictable termination + self.assertFalse(c.segment[3].SPcoc[3] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[3].SPcoc[3] & 0x0020) + self.assertEqual(c.segment[3].SPcoc[4], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + + # COC: Coding style component + self.assertEqual(c.segment[4].Ccoc, 1) + self.assertEqual(c.segment[4].SPcoc[0], 7) # levels + self.assertEqual(tuple(c.segment[4]._code_block_size), + (32, 32)) # cblk + # Selective arithmetic coding bypass + self.assertFalse(c.segment[4].SPcoc[3] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[4].SPcoc[3] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[4].SPcoc[3] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[4].SPcoc[3] & 0x08) + # Predictable termination + self.assertFalse(c.segment[4].SPcoc[3] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[4].SPcoc[3] & 0x0020) + self.assertEqual(c.segment[4].SPcoc[4], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + + # COC: Coding style component + self.assertEqual(c.segment[5].Ccoc, 2) + self.assertEqual(c.segment[5].SPcoc[0], 8) # levels + self.assertEqual(tuple(c.segment[5]._code_block_size), + (64, 64)) # cblk + # Selective arithmetic coding bypass + self.assertFalse(c.segment[5].SPcoc[3] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[5].SPcoc[3] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[5].SPcoc[3] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[5].SPcoc[3] & 0x08) + # Predictable termination + self.assertFalse(c.segment[5].SPcoc[3] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[5].SPcoc[3] & 0x0020) + self.assertEqual(c.segment[5].SPcoc[4], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + + # QCD: Quantization default + # quantization type + self.assertEqual(c.segment[6].Sqcd & 0x1f, 0) # none + self.assertEqual(c.segment[6]._guardBits, 4) + self.assertEqual(c.segment[6]._mantissa, [0] * 22) + self.assertEqual(c.segment[6]._exponent, + [11, 12, 12, 13, 12, 12, 13, 12, 12, 13, 12, 12, 13, + 12, 12, 13, 12, 12, 13, 12, 12, 13]) + + # QCC: Quantization component + # associated component + self.assertEqual(c.segment[7].Cqcc, 0) + # quantization type + self.assertEqual(c.segment[7].Sqcc & 0x1f, 0) # none + self.assertEqual(c.segment[7]._guardBits, 4) + self.assertEqual(c.segment[7]._mantissa, [0] * 19) + self.assertEqual(c.segment[7]._exponent, + [11, 12, 12, 13, 12, 12, 13, 12, 12, 13, 12, 12, 13, + 12, 12, 13, 12, 12, 13]) + + # QCC: Quantization component + # associated component + self.assertEqual(c.segment[8].Cqcc, 2) + # quantization type + self.assertEqual(c.segment[8].Sqcc & 0x1f, 0) # none + self.assertEqual(c.segment[8]._guardBits, 4) + self.assertEqual(c.segment[8]._mantissa, [0] * 25) + self.assertEqual(c.segment[8]._exponent, + [11, 12, 12, 13, 12, 12, 13, 12, 12, 13, 12, 12, 13, + 12, 12, 13, 12, 12, 13, 12, 12, 13, 12, 12, 13]) + + # COM: comment + # Registration + self.assertEqual(c.segment[9].Rcme, glymur.core.RCME_ISO_8859_1) + # Comment value + self.assertEqual(c.segment[9].Ccme.decode('latin-1'), + "Kakadu-3.0.7") + + # SOT: start of tile part + self.assertEqual(c.segment[10].Isot, 0) + self.assertEqual(c.segment[10].Psot, 3820593) + self.assertEqual(c.segment[10].TPsot, 0) + self.assertEqual(c.segment[10].TNsot, 1) # unknown + + def test_NR_p0_09_dump(self): + jfile = os.path.join(data_root, 'input/conformance/p0_09.j2k') + c = Jp2k(jfile).get_codestream(header_only=False) + + # SIZ: Image and tile size + # Profile: "0" means profile 2, or full capabilities + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 17) + self.assertEqual(c.segment[1].Ysiz, 37) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (17, 37)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8,)) + # signed + self.assertEqual(c.segment[1]._signed, (False,)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)]) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) + self.assertFalse(c.segment[2].Scod & 4) + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 1) # 1 + self.assertEqual(c.segment[2].SPcod[3], 0) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # levels + self.assertEqual(tuple(c.segment[2]._code_block_size), + (64, 64)) # cblk + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + # quantization type + self.assertEqual(c.segment[3].Sqcd & 0x1f, 2) # scalar expounded + self.assertEqual(c.segment[3]._guardBits, 1) + self.assertEqual(c.segment[3]._mantissa, + [1915, 1884, 1884, 1853, 1884, 1884, 1853, 1962, 1962, + 1986, 53, 53, 120, 26, 26, 1983]) + self.assertEqual(c.segment[3]._exponent, + [16, 16, 16, 16, 15, 15, 15, 14, 14, 14, 12, 12, 12, + 11, 11, 12]) + + # COM: comment + # Registration + self.assertEqual(c.segment[4].Rcme, glymur.core.RCME_ISO_8859_1) + # Comment value + self.assertEqual(c.segment[4].Ccme.decode('latin-1'), + "Kakadu-3.0.7") + + # SOT: start of tile part + self.assertEqual(c.segment[5].Isot, 0) + self.assertEqual(c.segment[5].Psot, 478) + self.assertEqual(c.segment[5].TPsot, 0) + self.assertEqual(c.segment[5].TNsot, 1) # unknown + + # SOD: start of data + # Just one. + self.assertEqual(c.segment[6].id, 'SOD') + + # EOC: end of codestream + self.assertEqual(c.segment[7].id, 'EOC') + + def test_NR_p0_10_dump(self): + jfile = os.path.join(data_root, 'input/conformance/p0_10.j2k') + c = Jp2k(jfile).get_codestream(header_only=False) + + # SIZ: Image and tile size + # Profile: "1" means profile 0 + self.assertEqual(c.segment[1].Rsiz, 1) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 256) + self.assertEqual(c.segment[1].Ysiz, 256) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (128, 128)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8, 8, 8)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(4, 4), (4, 4), (4, 4)]) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) + self.assertFalse(c.segment[2].Scod & 4) + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 2) # 2 + self.assertEqual(c.segment[2].SPcod[3], 1) # mct + self.assertEqual(c.segment[2].SPcod[4], 3) # levels + self.assertEqual(tuple(c.segment[2]._code_block_size), + (64, 64)) # cblk + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + # quantization type + self.assertEqual(c.segment[3].Sqcd & 0x1f, 0) # none + self.assertEqual(c.segment[3]._guardBits, 0) + self.assertEqual(c.segment[3]._mantissa, [0] * 10) + self.assertEqual(c.segment[3]._exponent, + [11, 12, 12, 13, 12, 12, 13, 12, 12, 13]) + + # SOT: start of tile part + self.assertEqual(c.segment[4].Isot, 0) + self.assertEqual(c.segment[4].Psot, 2453) + self.assertEqual(c.segment[4].TPsot, 0) + self.assertEqual(c.segment[4].TNsot, 0) + + # SOD: start of data + self.assertEqual(c.segment[5].id, 'SOD') + + # SOT: start of tile part + self.assertEqual(c.segment[6].Isot, 1) + self.assertEqual(c.segment[6].Psot, 2403) + self.assertEqual(c.segment[6].TPsot, 0) + self.assertEqual(c.segment[6].TNsot, 0) + + # SOD: start of data + self.assertEqual(c.segment[7].id, 'SOD') + + # SOT: start of tile part + self.assertEqual(c.segment[8].Isot, 2) + self.assertEqual(c.segment[8].Psot, 2420) + self.assertEqual(c.segment[8].TPsot, 0) + self.assertEqual(c.segment[8].TNsot, 0) + + # SOD: start of data + self.assertEqual(c.segment[9].id, 'SOD') + + # SOT: start of tile part + self.assertEqual(c.segment[10].Isot, 3) + self.assertEqual(c.segment[10].Psot, 2472) + self.assertEqual(c.segment[10].TPsot, 0) + self.assertEqual(c.segment[10].TNsot, 0) + + # SOD: start of data + self.assertEqual(c.segment[11].id, 'SOD') + + # SOT: start of tile part + self.assertEqual(c.segment[12].Isot, 0) + self.assertEqual(c.segment[12].Psot, 1043) + self.assertEqual(c.segment[12].TPsot, 1) + self.assertEqual(c.segment[12].TNsot, 2) + + # SOD: start of data + self.assertEqual(c.segment[13].id, 'SOD') + + # SOT: start of tile part + self.assertEqual(c.segment[14].Isot, 1) + self.assertEqual(c.segment[14].Psot, 1101) + self.assertEqual(c.segment[14].TPsot, 1) + self.assertEqual(c.segment[14].TNsot, 2) + + # SOD: start of data + self.assertEqual(c.segment[15].id, 'SOD') + + # SOT: start of tile part + self.assertEqual(c.segment[16].Isot, 3) + self.assertEqual(c.segment[16].Psot, 1054) + self.assertEqual(c.segment[16].TPsot, 1) + self.assertEqual(c.segment[16].TNsot, 2) + + # SOD: start of data + self.assertEqual(c.segment[17].id, 'SOD') + + # SOT: start of tile part + self.assertEqual(c.segment[18].Isot, 2) + self.assertEqual(c.segment[18].Psot, 14) + self.assertEqual(c.segment[18].TPsot, 1) + self.assertEqual(c.segment[18].TNsot, 0) + + # SOD: start of data + self.assertEqual(c.segment[19].id, 'SOD') + + # SOT: start of tile part + self.assertEqual(c.segment[20].Isot, 2) + self.assertEqual(c.segment[20].Psot, 1089) + self.assertEqual(c.segment[20].TPsot, 2) + self.assertEqual(c.segment[20].TNsot, 0) + + # SOD: start of data + self.assertEqual(c.segment[21].id, 'SOD') + + # EOC: end of codestream + self.assertEqual(c.segment[22].id, 'EOC') + + def test_NR_p0_11_dump(self): + jfile = os.path.join(data_root, 'input/conformance/p0_11.j2k') + c = Jp2k(jfile).get_codestream(header_only=False) + + # SIZ: Image and tile size + # Profile: "1" means profile 0 + self.assertEqual(c.segment[1].Rsiz, 1) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 128) + self.assertEqual(c.segment[1].Ysiz, 1) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (128, 128)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8,)) + # signed + self.assertEqual(c.segment[1]._signed, (False,)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)]) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) + self.assertTrue(c.segment[2].Scod & 4) + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 1) # 1 + self.assertEqual(c.segment[2].SPcod[3], 0) # mct + self.assertEqual(c.segment[2].SPcod[4], 0) # levels + self.assertEqual(tuple(c.segment[2]._code_block_size), + (64, 64)) # cblk + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertTrue(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(c.segment[2]._precinct_size, [(128, 2)]) + + # QCD: Quantization default + # quantization type + self.assertEqual(c.segment[3].Sqcd & 0x1f, 0) # none + self.assertEqual(c.segment[3]._guardBits, 3) + self.assertEqual(c.segment[3]._mantissa, [0]) + self.assertEqual(c.segment[3]._exponent, [8]) + + # COM: comment + # Registration + self.assertEqual(c.segment[4].Rcme, glymur.core.RCME_ISO_8859_1) + # Comment value + self.assertEqual(c.segment[4].Ccme.decode('latin-1'), + "Creator: AV-J2K (c) 2000,2001 Algo Vision") + + # SOT: start of tile part + self.assertEqual(c.segment[5].Isot, 0) + self.assertEqual(c.segment[5].Psot, 118) + self.assertEqual(c.segment[5].TPsot, 0) + self.assertEqual(c.segment[5].TNsot, 1) + + # SOD: start of data + self.assertEqual(c.segment[6].id, 'SOD') + + # SOP, EPH + sop = [x.id for x in c.segment if x.id == 'SOP'] + eph = [x.id for x in c.segment if x.id == 'EPH'] + self.assertEqual(len(sop), 0) + self.assertEqual(len(eph), 1) + + # EOC: end of codestream + self.assertEqual(c.segment[-1].id, 'EOC') + + def test_NR_p0_12_dump(self): + jfile = os.path.join(data_root, 'input/conformance/p0_12.j2k') + c = Jp2k(jfile).get_codestream(header_only=False) + + # SIZ: Image and tile size + # Profile: "1" means profile 0 + self.assertEqual(c.segment[1].Rsiz, 1) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 3) + self.assertEqual(c.segment[1].Ysiz, 5) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (3, 5)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8,)) + # signed + self.assertEqual(c.segment[1]._signed, (False,)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)]) + + # COD: Coding style default + self.assertTrue(c.segment[2].Scod & 2) + self.assertFalse(c.segment[2].Scod & 4) + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 1) # 1 + self.assertEqual(c.segment[2].SPcod[3], 0) # mct + self.assertEqual(c.segment[2].SPcod[4], 3) # levels + self.assertEqual(tuple(c.segment[2]._code_block_size), + (32, 32)) # cblk + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertTrue(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + # quantization type + self.assertEqual(c.segment[3].Sqcd & 0x1f, 0) # none + self.assertEqual(c.segment[3]._guardBits, 3) + self.assertEqual(c.segment[3]._mantissa, [0] * 10) + self.assertEqual(c.segment[3]._exponent, + [8, 9, 9, 10, 9, 9, 10, 9, 9, 10]) + + # COM: comment + # Registration + self.assertEqual(c.segment[4].Rcme, glymur.core.RCME_ISO_8859_1) + # Comment value + self.assertEqual(c.segment[4].Ccme.decode('latin-1'), + "Creator: AV-J2K (c) 2000,2001 Algo Vision") + + # SOT: start of tile part + self.assertEqual(c.segment[5].Isot, 0) + self.assertEqual(c.segment[5].Psot, 162) + self.assertEqual(c.segment[5].TPsot, 0) + self.assertEqual(c.segment[5].TNsot, 1) + + # SOD: start of data + self.assertEqual(c.segment[6].id, 'SOD') + + # SOP, EPH + sop = [x.id for x in c.segment if x.id == 'SOP'] + eph = [x.id for x in c.segment if x.id == 'EPH'] + self.assertEqual(len(sop), 4) + self.assertEqual(len(eph), 0) + + # EOC: end of codestream + self.assertEqual(c.segment[-1].id, 'EOC') + + def test_NR_p0_13_dump(self): + jfile = os.path.join(data_root, 'input/conformance/p0_13.j2k') + c = Jp2k(jfile).get_codestream(header_only=False) + + # SIZ: Image and tile size + # Profile: "1" means profile 0 + self.assertEqual(c.segment[1].Rsiz, 1) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 1) + self.assertEqual(c.segment[1].Ysiz, 1) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (1, 1)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, tuple([8] * 257)) + # signed + self.assertEqual(c.segment[1]._signed, tuple([False] * 257)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 257) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.RLCP) + self.assertEqual(c.segment[2]._layers, 1) # layers = 1 + self.assertEqual(c.segment[2].SPcod[3], 1) # mct + self.assertEqual(c.segment[2].SPcod[4], 1) # levels + self.assertEqual(tuple(c.segment[2]._code_block_size), (32, 32)) + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertTrue(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # COC: Coding style component + self.assertEqual(c.segment[3].Ccoc, 2) + self.assertEqual(c.segment[3].SPcoc[0], 1) # levels + self.assertEqual(tuple(c.segment[3]._code_block_size), (64, 64)) + # Selective arithmetic coding bypass + self.assertFalse(c.segment[3].SPcoc[3] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[3].SPcoc[3] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[3].SPcoc[3] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[3].SPcoc[3] & 0x08) + # Predictable termination + self.assertFalse(c.segment[3].SPcoc[3] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[3].SPcoc[3] & 0x0020) + self.assertEqual(c.segment[3].SPcoc[4], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + + # QCD: Quantization default + # quantization type + self.assertEqual(c.segment[4].Sqcd & 0x1f, 0) # none + self.assertEqual(c.segment[4]._guardBits, 2) + self.assertEqual(c.segment[4]._mantissa, [0] * 4) + self.assertEqual(c.segment[4]._exponent, + [8, 9, 9, 10]) + + # QCC: Quantization component + # associated component + self.assertEqual(c.segment[5].Cqcc, 1) + self.assertEqual(c.segment[5]._guardBits, 3) + # quantization type + self.assertEqual(c.segment[5].Sqcc & 0x1f, 0) # none + self.assertEqual(c.segment[5]._exponent, [9, 10, 10, 11]) + self.assertEqual(c.segment[5]._mantissa, [0, 0, 0, 0]) + + # QCC: Quantization component + # associated component + self.assertEqual(c.segment[6].Cqcc, 2) + self.assertEqual(c.segment[6]._guardBits, 2) + # quantization type + self.assertEqual(c.segment[6].Sqcc & 0x1f, 0) # none + self.assertEqual(c.segment[6]._exponent, [9, 10, 10, 11]) + self.assertEqual(c.segment[6]._mantissa, [0, 0, 0, 0]) + + # RGN: region of interest + self.assertEqual(c.segment[7].Crgn, 3) + self.assertEqual(c.segment[7].Srgn, 0) + self.assertEqual(c.segment[7].SPrgn, 11) + + # POD: progression order change + self.assertEqual(c.segment[8].RSpod, (0, 0)) + self.assertEqual(c.segment[8].CSpod, (0, 128)) + self.assertEqual(c.segment[8].LYEpod, (1, 1)) + self.assertEqual(c.segment[8].REpod, (33, 33)) + self.assertEqual(c.segment[8].CEpod, (128, 257)) + self.assertEqual(c.segment[8].Ppod, + (glymur.core.RLCP, glymur.core.CPRL)) + + # COM: comment + # Registration + self.assertEqual(c.segment[9].Rcme, glymur.core.RCME_ISO_8859_1) + # Comment value + self.assertEqual(c.segment[9].Ccme.decode('latin-1'), + "Creator: AV-J2K (c) 2000,2001 Algo Vision") + + # SOT: start of tile part + self.assertEqual(c.segment[10].Isot, 0) + self.assertEqual(c.segment[10].Psot, 1537) + self.assertEqual(c.segment[10].TPsot, 0) + self.assertEqual(c.segment[10].TNsot, 1) + + # SOD: start of data + self.assertEqual(c.segment[11].id, 'SOD') + + # EOC: end of codestream + self.assertEqual(c.segment[12].id, 'EOC') + + def test_NR_p0_14_dump(self): + jfile = os.path.join(data_root, 'input/conformance/p0_14.j2k') + c = Jp2k(jfile).get_codestream(header_only=False) + + # SIZ: Image and tile size + # Profile: "0" means profile 2 + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 49) + self.assertEqual(c.segment[1].Ysiz, 49) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (49, 49)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8, 8, 8)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 3) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) + self.assertFalse(c.segment[2].Scod & 4) + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 1) # 1 layer + self.assertEqual(c.segment[2].SPcod[3], 1) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # levels + self.assertEqual(tuple(c.segment[2]._code_block_size), (64, 64)) + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + # quantization type + self.assertEqual(c.segment[3].Sqcd & 0x1f, 0) # none + self.assertEqual(c.segment[3]._guardBits, 1) + self.assertEqual(c.segment[3]._mantissa, [0] * 16) + self.assertEqual(c.segment[3]._exponent, + [10, 11, 11, 12, 11, 11, 12, 11, 11, 12, 11, 11, 12, + 11, 11, 12]) + + # COM: comment + # Registration + self.assertEqual(c.segment[4].Rcme, glymur.core.RCME_ISO_8859_1) + # Comment value + self.assertEqual(c.segment[4].Ccme.decode('latin-1'), + "Kakadu-3.0.7") + + # SOT: start of tile part + self.assertEqual(c.segment[5].Isot, 0) + self.assertEqual(c.segment[5].Psot, 1528) + self.assertEqual(c.segment[5].TPsot, 0) + self.assertEqual(c.segment[5].TNsot, 1) + + # SOD: start of data + self.assertEqual(c.segment[6].id, 'SOD') + + # EOC: end of codestream + self.assertEqual(c.segment[7].id, 'EOC') + + def test_NR_p0_15_dump(self): + jfile = os.path.join(data_root, 'input/conformance/p0_15.j2k') + c = Jp2k(jfile).get_codestream(header_only=False) + + # SIZ: Image and tile size + # Profile: "1" means profile 0 + self.assertEqual(c.segment[1].Rsiz, 1) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 256) + self.assertEqual(c.segment[1].Ysiz, 256) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (128, 128)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (4,)) + # signed + self.assertEqual(c.segment[1]._signed, (True,)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)]) + + # COD: Coding style default + self.assertTrue(c.segment[2].Scod & 2) + self.assertFalse(c.segment[2].Scod & 4) + self.assertEqual(c.segment[2].SPcod[0], glymur.core.PCRL) + self.assertEqual(c.segment[2]._layers, 8) # layers = 8 + self.assertEqual(c.segment[2].SPcod[3], 0) # mct + self.assertEqual(c.segment[2].SPcod[4], 1) # levels + self.assertEqual(tuple(c.segment[2]._code_block_size), (64, 64)) + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + # quantization type + self.assertEqual(c.segment[3].Sqcd & 0x1f, 1) # derived + self.assertEqual(c.segment[3]._guardBits, 2) + self.assertEqual(c.segment[3]._mantissa, [0]) + self.assertEqual(c.segment[3]._exponent, [0]) + + # QCC: Quantization component + # associated component + self.assertEqual(c.segment[4].Cqcc, 0) + self.assertEqual(c.segment[4]._guardBits, 2) + # quantization type + self.assertEqual(c.segment[4].Sqcc & 0x1f, 0) # none + self.assertEqual(c.segment[4]._mantissa, [0] * 4) + self.assertEqual(c.segment[4]._exponent, [4, 5, 5, 6]) + + # POD: progression order change + self.assertEqual(c.segment[5].RSpod, (0,)) + self.assertEqual(c.segment[5].CSpod, (0,)) + self.assertEqual(c.segment[5].LYEpod, (8,)) + self.assertEqual(c.segment[5].REpod, (33,)) + self.assertEqual(c.segment[5].CEpod, (255,)) + self.assertEqual(c.segment[5].Ppod, (glymur.core.LRCP,)) + + # CRG: component registration + self.assertEqual(c.segment[6].Xcrg, (65424,)) + self.assertEqual(c.segment[6].Ycrg, (32558,)) + + # COM: comment + # Registration + self.assertEqual(c.segment[7].Rcme, glymur.core.RCME_ISO_8859_1) + # Comment value + self.assertEqual(c.segment[7].Ccme.decode('latin-1'), + "Creator: AV-J2K (c) 2000,2001 Algo Vision") + + # COM: comment + # Registration + self.assertEqual(c.segment[8].Rcme, glymur.core.RCME_ISO_8859_1) + # Comment value + self.assertEqual(c.segment[8].Ccme.decode('latin-1'), + "Creator: AV-J2K (c) 2000," + + "2001 Algo Vision Technology") + + # COM: comment + # Registration + self.assertEqual(c.segment[9].Rcme, glymur.core.RCME_BINARY) + # Comment value + self.assertEqual(len(c.segment[9].Ccme), 62) + + # TLM: tile-part length + self.assertEqual(c.segment[10].Ztlm, 0) + self.assertEqual(c.segment[10].Ttlm, (0, 1, 2, 3)) + self.assertEqual(c.segment[10].Ptlm, (4267, 2117, 4080, 2081)) + + # SOT: start of tile part + self.assertEqual(c.segment[11].Isot, 0) + self.assertEqual(c.segment[11].Psot, 4267) + self.assertEqual(c.segment[11].TPsot, 0) + self.assertEqual(c.segment[11].TNsot, 1) + + # RGN: region of interest + self.assertEqual(c.segment[12].Crgn, 0) + self.assertEqual(c.segment[12].Srgn, 0) + self.assertEqual(c.segment[12].SPrgn, 7) + + # SOD: start of data + self.assertEqual(c.segment[13].id, 'SOD') + + # 16 SOP markers would be here if we were looking for them + + # SOT: start of tile part + self.assertEqual(c.segment[31].Isot, 1) + self.assertEqual(c.segment[31].Psot, 2117) + self.assertEqual(c.segment[31].TPsot, 0) + self.assertEqual(c.segment[31].TNsot, 1) + + # SOD: start of data + self.assertEqual(c.segment[32].id, 'SOD') + + # 16 SOP markers would be here if we were looking for them + + # SOT: start of tile part + self.assertEqual(c.segment[49].Isot, 2) + self.assertEqual(c.segment[49].Psot, 4080) + self.assertEqual(c.segment[49].TPsot, 0) + self.assertEqual(c.segment[49].TNsot, 1) + + # SOD: start of data + self.assertEqual(c.segment[50].id, 'SOD') + + # 16 SOP markers would be here if we were looking for them + + # SOT: start of tile part + self.assertEqual(c.segment[67].Isot, 3) + self.assertEqual(c.segment[67].Psot, 2081) + self.assertEqual(c.segment[67].TPsot, 0) + self.assertEqual(c.segment[67].TNsot, 1) + + # SOD: start of data + self.assertEqual(c.segment[68].id, 'SOD') + + # 16 SOP markers would be here if we were looking for them + + # EOC: end of codestream + self.assertEqual(c.segment[85].id, 'EOC') + + def test_NR_p0_16_dump(self): + jfile = os.path.join(data_root, 'input/conformance/p0_16.j2k') + c = Jp2k(jfile).get_codestream(header_only=False) + + # SIZ: Image and tile size + # Profile: "0" means profile 2 + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 128) + self.assertEqual(c.segment[1].Ysiz, 128) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (128, 128)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8,)) + # signed + self.assertEqual(c.segment[1]._signed, (False,)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)]) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) + self.assertFalse(c.segment[2].Scod & 4) + self.assertEqual(c.segment[2].SPcod[0], glymur.core.RLCP) + self.assertEqual(c.segment[2]._layers, 3) # layers = 3 + self.assertEqual(c.segment[2].SPcod[3], 0) # mct + self.assertEqual(c.segment[2].SPcod[4], 3) # levels + self.assertEqual(tuple(c.segment[2]._code_block_size), (64, 64)) + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + # quantization type + self.assertEqual(c.segment[3].Sqcd & 0x1f, 0) # none + self.assertEqual(c.segment[3]._guardBits, 2) + self.assertEqual(c.segment[3]._mantissa, [0] * 10) + self.assertEqual(c.segment[3]._exponent, + [8, 9, 9, 10, 9, 9, 10, 9, 9, 10]) + + # SOT: start of tile part + self.assertEqual(c.segment[4].Isot, 0) + self.assertEqual(c.segment[4].Psot, 7331) + self.assertEqual(c.segment[4].TPsot, 0) + self.assertEqual(c.segment[4].TNsot, 1) + + # SOD: start of data + self.assertEqual(c.segment[5].id, 'SOD') + + # EOC: end of codestream + self.assertEqual(c.segment[6].id, 'EOC') + + def test_NR_p1_01_dump(self): + jfile = os.path.join(data_root, 'input/conformance/p1_01.j2k') + c = Jp2k(jfile).get_codestream(header_only=False) + + # SIZ: Image and tile size + # Profile: "1" means profile 1 + self.assertEqual(c.segment[1].Rsiz, 2) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 127) + self.assertEqual(c.segment[1].Ysiz, 227) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (5, 128)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (127, 126)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (1, 101)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8,)) + # signed + self.assertEqual(c.segment[1]._signed, (False,)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(2, 1)]) + + # COD: Coding style default + self.assertTrue(c.segment[2].Scod & 2) # SOP + self.assertTrue(c.segment[2].Scod & 4) # EPH + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 5) # layers = 5 + self.assertEqual(c.segment[2].SPcod[3], 0) # mct + self.assertEqual(c.segment[2].SPcod[4], 3) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), (64, 64)) + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertTrue(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertTrue(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertTrue(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # COC: Coding style component + self.assertEqual(c.segment[3].Ccoc, 0) + self.assertEqual(c.segment[3].SPcoc[0], 3) # level + self.assertEqual(tuple(c.segment[3]._code_block_size), (32, 32)) + # Selective arithmetic coding bypass + self.assertFalse(c.segment[3].SPcoc[3] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[3].SPcoc[3] & 0x02) + # Termination on each coding pass + self.assertTrue(c.segment[3].SPcoc[3] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[3].SPcoc[3] & 0x08) + # Predictable termination + self.assertTrue(c.segment[3].SPcoc[3] & 0x0010) + # Segmentation symbols + self.assertTrue(c.segment[3].SPcoc[3] & 0x0020) + self.assertEqual(c.segment[3].SPcoc[4], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + + # QCD: Quantization default + # quantization type + self.assertEqual(c.segment[4].Sqcd & 0x1f, 0) # none + self.assertEqual(c.segment[4]._guardBits, 3) + self.assertEqual(c.segment[4]._mantissa, [0] * 10) + self.assertEqual(c.segment[4]._exponent, + [8, 9, 9, 10, 9, 9, 10, 9, 9, 10]) + + # COM: comment + # Registration + self.assertEqual(c.segment[5].Rcme, glymur.core.RCME_ISO_8859_1) + # Comment value + self.assertEqual(c.segment[5].Ccme.decode('latin-1'), + "Creator: AV-J2K (c) 2000,2001 Algo Vision") + + # SOT: start of tile part + self.assertEqual(c.segment[6].Isot, 0) + self.assertEqual(c.segment[6].Psot, 4627) + self.assertEqual(c.segment[6].TPsot, 0) + self.assertEqual(c.segment[6].TNsot, 1) + + # SOD: start of data + self.assertEqual(c.segment[7].id, 'SOD') + + # SOP, EPH + sop = [x.id for x in c.segment if x.id == 'SOP'] + eph = [x.id for x in c.segment if x.id == 'EPH'] + self.assertEqual(len(sop), 20) + self.assertEqual(len(eph), 20) + + # EOC: end of codestream + self.assertEqual(c.segment[-1].id, 'EOC') + + def test_NR_p1_02_dump(self): + jfile = os.path.join(data_root, 'input/conformance/p1_02.j2k') + c = Jp2k(jfile).get_codestream(header_only=False) + + # SIZ: Image and tile size + # Profile: "1" means profile 1 + self.assertEqual(c.segment[1].Rsiz, 2) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 640) + self.assertEqual(c.segment[1].Ysiz, 480) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (640, 480)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, tuple([8] * 3)) + # signed + self.assertEqual(c.segment[1]._signed, tuple([False] * 3)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 3) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 19) # layers = 19 + self.assertEqual(c.segment[2].SPcod[3], 1) # mct + self.assertEqual(c.segment[2].SPcod[4], 6) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), + (64, 64)) # cblk + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertTrue(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertTrue(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE) + self.assertEqual(c.segment[2]._precinct_size, + [(128, 128), (256, 256), (512, 512), (1024, 1024), + (2048, 2048), (4096, 4096), (8192, 8192)]) + + # QCD: Quantization default + # quantization type + self.assertEqual(c.segment[3].Sqcd & 0x1f, 2) # expounded + self.assertEqual(c.segment[3]._guardBits, 3) + self.assertEqual(c.segment[3]._mantissa, + [1814, 1815, 1815, 1817, 1821, 1821, 1827, 1845, 1845, + 1868, 1925, 1925, 2007, 32, 32, 131, 2002, 2002, + 1888]) + self.assertEqual(c.segment[3]._exponent, + [16, 16, 16, 16, 15, 15, 15, 14, 14, 14, 13, 13, 13, + 11, 11, 11, 11, 11, 11]) + + # QCC: Quantization component + # associated component + self.assertEqual(c.segment[4].Cqcc, 1) + self.assertEqual(c.segment[4]._guardBits, 3) + # quantization type + self.assertEqual(c.segment[4].Sqcc & 0x1f, 2) # expounded + self.assertEqual(c.segment[4]._mantissa, + [1814, 1815, 1815, 1817, 1821, 1821, 1827, 1845, 1845, + 1868, 1925, 1925, 2007, 32, 32, 131, 2002, 2002, + 1888]) + self.assertEqual(c.segment[4]._exponent, + [14, 14, 14, 14, 13, 13, 13, 12, 12, 12, 11, 11, 11, + 9, 9, 9, 9, 9, 9]) + + # QCC: Quantization component + # associated component + self.assertEqual(c.segment[5].Cqcc, 2) + self.assertEqual(c.segment[5]._guardBits, 3) + # quantization type + self.assertEqual(c.segment[5].Sqcc & 0x1f, 2) # expounded + self.assertEqual(c.segment[5]._mantissa, + [1814, 1815, 1815, 1817, 1821, 1821, 1827, 1845, 1845, + 1868, 1925, 1925, 2007, 32, 32, 131, 2002, 2002, + 1888]) + self.assertEqual(c.segment[5]._exponent, + [14, 14, 14, 14, 13, 13, 13, 12, 12, 12, 11, 11, 11, + 9, 9, 9, 9, 9, 9]) + + # COM: comment + # Registration + self.assertEqual(c.segment[6].Rcme, glymur.core.RCME_ISO_8859_1) + # Comment value + self.assertEqual(c.segment[6].Ccme.decode('latin-1'), + "Creator: AV-J2K (c) 2000,2001 Algo Vision") + + # SOT: start of tile part + self.assertEqual(c.segment[7].Isot, 0) + self.assertEqual(c.segment[7].Psot, 262838) + self.assertEqual(c.segment[7].TPsot, 0) + self.assertEqual(c.segment[7].TNsot, 1) + + # PPT: packed packet headers, tile-part header + self.assertEqual(c.segment[8].id, 'PPT') + self.assertEqual(c.segment[8].Zppt, 0) + + # SOD: start of data + self.assertEqual(c.segment[9].id, 'SOD') + + # EOC: end of codestream + self.assertEqual(c.segment[10].id, 'EOC') + + def test_NR_p1_03_dump(self): + jfile = os.path.join(data_root, 'input/conformance/p1_03.j2k') + c = Jp2k(jfile).get_codestream(header_only=False) + + # SIZ: Image and tile size + # Profile: "1" means profile 1 + self.assertEqual(c.segment[1].Rsiz, 2) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 1024) + self.assertEqual(c.segment[1].Ysiz, 1024) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), + (1024, 1024)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, tuple([8] * 4)) + # signed + self.assertEqual(c.segment[1]._signed, tuple([False] * 4)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1), (1, 1), (2, 2), (2, 2)]) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.PCRL) + self.assertEqual(c.segment[2]._layers, 10) # layers = 10 + self.assertEqual(c.segment[2].SPcod[3], 0) # mct + self.assertEqual(c.segment[2].SPcod[4], 6) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), (32, 32)) + # Selective arithmetic coding bypass + self.assertTrue(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertTrue(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # COC: Coding style component + self.assertEqual(c.segment[3].Ccoc, 1) + self.assertEqual(c.segment[3].SPcoc[0], 3) # level + self.assertEqual(tuple(c.segment[3]._code_block_size), (32, 32)) + # Selective arithmetic coding bypass + self.assertTrue(c.segment[3].SPcoc[3] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[3].SPcoc[3] & 0x02) + # Termination on each coding pass + self.assertTrue(c.segment[3].SPcoc[3] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[3].SPcoc[3] & 0x08) + # Predictable termination + self.assertFalse(c.segment[3].SPcoc[3] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[3].SPcoc[3] & 0x0020) + self.assertEqual(c.segment[3].SPcoc[4], + glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE) + + # COC: Coding style component + self.assertEqual(c.segment[4].Ccoc, 3) + self.assertEqual(c.segment[4].SPcoc[0], 6) # level + self.assertEqual(tuple(c.segment[4]._code_block_size), (32, 32)) + # Selective arithmetic coding bypass + self.assertTrue(c.segment[4].SPcoc[3] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[4].SPcoc[3] & 0x02) + # Termination on each coding pass + self.assertTrue(c.segment[4].SPcoc[3] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[4].SPcoc[3] & 0x08) + # Predictable termination + self.assertFalse(c.segment[4].SPcoc[3] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[4].SPcoc[3] & 0x0020) + self.assertEqual(c.segment[4].SPcoc[4], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + + # QCD: Quantization default + # quantization type + self.assertEqual(c.segment[5].Sqcd & 0x1f, 2) # expounded + self.assertEqual(c.segment[5]._guardBits, 3) + self.assertEqual(c.segment[5]._mantissa, + [1814, 1815, 1815, 1817, 1821, 1821, 1827, 1845, 1845, + 1868, 1925, 1925, 2007, 32, 32, 131, 2002, 2002, + 1888]) + self.assertEqual(c.segment[5]._exponent, + [16, 16, 16, 16, 15, 15, 15, 14, 14, 14, 13, 13, 13, + 11, 11, 11, 11, 11, 11]) + + # QCC: Quantization component + # associated component + self.assertEqual(c.segment[6].Cqcc, 0) + self.assertEqual(c.segment[6]._guardBits, 3) + # quantization type + self.assertEqual(c.segment[6].Sqcc & 0x1f, 1) # derived + self.assertEqual(c.segment[6]._mantissa, [0]) + self.assertEqual(c.segment[6]._exponent, [14]) + + # QCC: Quantization component + # associated component + self.assertEqual(c.segment[7].Cqcc, 3) + self.assertEqual(c.segment[7]._guardBits, 3) + # quantization type + self.assertEqual(c.segment[7].Sqcc & 0x1f, 0) # none + self.assertEqual(c.segment[7]._mantissa, [0] * 19) + self.assertEqual(c.segment[7]._exponent, + [8, 9, 9, 10, 9, 9, 10, 9, 9, 10, 9, 9, 10, 9, 9, 10, + 9, 9, 10]) + + # COM: comment + # Registration + self.assertEqual(c.segment[8].Rcme, glymur.core.RCME_ISO_8859_1) + # Comment value + self.assertEqual(c.segment[8].Ccme.decode('latin-1'), + "Creator: AV-J2K (c) 2000,2001 Algo Vision") + + # PPM: packed packet headers, main header + self.assertEqual(c.segment[9].id, 'PPM') + self.assertEqual(c.segment[9].Zppm, 0) + + # TLM (tile-part length) + self.assertEqual(c.segment[10].Ztlm, 0) + self.assertEqual(c.segment[10].Ttlm, (0,)) + self.assertEqual(c.segment[10].Ptlm, (1366780,)) + + # SOT: start of tile part + self.assertEqual(c.segment[11].Isot, 0) + self.assertEqual(c.segment[11].Psot, 1366780) + self.assertEqual(c.segment[11].TPsot, 0) + self.assertEqual(c.segment[11].TNsot, 1) + + # SOD: start of data + self.assertEqual(c.segment[12].id, 'SOD') + + # EOC: end of codestream + self.assertEqual(c.segment[13].id, 'EOC') + + def test_NR_p1_04_dump(self): + jfile = os.path.join(data_root, 'input/conformance/p1_04.j2k') + c = Jp2k(jfile).get_codestream(header_only=False) + + # SIZ: Image and tile size + # Profile: "1" means profile 1 + self.assertEqual(c.segment[1].Rsiz, 2) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 1024) + self.assertEqual(c.segment[1].Ysiz, 1024) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (128, 128)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (12,)) + # signed + self.assertEqual(c.segment[1]._signed, (False,)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)]) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 1) # layers = 1 + self.assertEqual(c.segment[2].SPcod[3], 0) # mct + self.assertEqual(c.segment[2].SPcod[4], 3) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), (64, 64)) + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + # quantization type + self.assertEqual(c.segment[3].Sqcd & 0x1f, 2) # expounded + self.assertEqual(c.segment[3]._guardBits, 2) + self.assertEqual(c.segment[3]._mantissa, + [84, 423, 408, 435, 450, 435, 470, 549, 520, 618]) + self.assertEqual(c.segment[3]._exponent, + [8, 10, 10, 10, 9, 9, 9, 8, 8, 8]) + + # TLM (tile-part length) + self.assertEqual(c.segment[4].Ztlm, 0) + self.assertIsNone(c.segment[4].Ttlm) + self.assertEqual(c.segment[4].Ptlm, + (350, 356, 402, 245, 402, 564, 675, 283, 317, 299, + 330, 333, 346, 403, 839, 667, 328, 349, 274, 325, + 501, 561, 756, 710, 779, 620, 628, 675, 600, 66195, + 721, 719, 565, 565, 546, 586, 574, 641, 713, 634, + 573, 528, 544, 597, 771, 665, 624, 706, 568, 537, + 554, 546, 542, 635, 826, 667, 617, 606, 813, 586, + 641, 654, 669, 623)) + + # COM: comment + # Registration + self.assertEqual(c.segment[5].Rcme, glymur.core.RCME_ISO_8859_1) + # Comment value + self.assertEqual(c.segment[5].Ccme.decode('latin-1'), + "Created by Aware, Inc.") + + # SOT: start of tile part + self.assertEqual(c.segment[6].Isot, 0) + self.assertEqual(c.segment[6].Psot, 350) + self.assertEqual(c.segment[6].TPsot, 0) + self.assertEqual(c.segment[6].TNsot, 1) + + # SOD: start of data + self.assertEqual(c.segment[7].id, 'SOD') + + # SOT: start of tile part + self.assertEqual(c.segment[8].Isot, 1) + self.assertEqual(c.segment[8].Psot, 356) + self.assertEqual(c.segment[8].TPsot, 0) + self.assertEqual(c.segment[8].TNsot, 1) + + # QCD: Quantization default + # quantization type + self.assertEqual(c.segment[9].Sqcd & 0x1f, 2) # expounded + self.assertEqual(c.segment[9]._guardBits, 2) + self.assertEqual(c.segment[9]._mantissa, + [75, 1093, 1098, 1115, 1157, 1134, 1186, 1217, 1245, + 1248]) + self.assertEqual(c.segment[9]._exponent, + [8, 10, 10, 10, 9, 9, 9, 8, 8, 8]) + + # SOD: start of data + self.assertEqual(c.segment[10].id, 'SOD') + + # SOT: start of tile part + self.assertEqual(c.segment[11].Isot, 2) + self.assertEqual(c.segment[11].Psot, 402) + self.assertEqual(c.segment[11].TPsot, 0) + self.assertEqual(c.segment[11].TNsot, 1) + + # and so on + + # There should be 64 SOD, SOT, QCD segments. + ids = [x.id for x in c.segment if x.id == 'SOT'] + self.assertEqual(len(ids), 64) + ids = [x.id for x in c.segment if x.id == 'SOD'] + self.assertEqual(len(ids), 64) + ids = [x.id for x in c.segment if x.id == 'QCD'] + self.assertEqual(len(ids), 64) + + # Tiles should be in order, right? + tiles = [x.Isot for x in c.segment if x.id == 'SOT'] + self.assertEqual(tiles, list(range(64))) + + # EOC: end of codestream + self.assertEqual(c.segment[-1].id, 'EOC') + + def test_NR_p1_05_dump(self): + jfile = os.path.join(data_root, 'input/conformance/p1_05.j2k') + c = Jp2k(jfile).get_codestream(header_only=False) + + # SIZ: Image and tile size + # Profile: "1" means profile 1 + self.assertEqual(c.segment[1].Rsiz, 2) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 529) + self.assertEqual(c.segment[1].Ysiz, 524) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (17, 12)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (37, 37)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (8, 2)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8, 8, 8)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 3) + + # COD: Coding style default + self.assertTrue(c.segment[2].Scod & 2) # sop + self.assertTrue(c.segment[2].Scod & 4) # eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.PCRL) + self.assertEqual(c.segment[2]._layers, 2) # levels = 2 + self.assertEqual(c.segment[2].SPcod[3], 1) # mct + self.assertEqual(c.segment[2].SPcod[4], 7) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), (64, 8)) # cblk + # Selective arithmetic coding bypass + self.assertTrue(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertTrue(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertTrue(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE) + self.assertEqual(c.segment[2]._precinct_size, [(16, 16)] * 8) + + self.assertEqual(c.segment[3].Sqcd & 0x1f, 2) # expounded + self.assertEqual(c.segment[3]._guardBits, 3) + self.assertEqual(c.segment[3]._mantissa, + [1813, 1814, 1814, 1814, 1815, 1815, 1817, 1821, + 1821, 1827, 1845, 1845, 1868, 1925, 1925, 2007, + 32, 32, 131, 2002, 2002, 1888]) + self.assertEqual(c.segment[3]._exponent, + [17, 17, 17, 17, 16, 16, 16, 15, 15, 15, 14, 14, + 14, 13, 13, 13, 11, 11, 11, 11, 11, 11]) + + # COM: comment + # Registration + self.assertEqual(c.segment[4].Rcme, glymur.core.RCME_ISO_8859_1) + # Comment value + self.assertEqual(c.segment[4].Ccme.decode('latin-1'), + "Creator: AV-J2K (c) 2000,2001 Algo Vision") + + # 225 consecutive PPM segments. + zppm = [x.Zppm for x in c.segment[5:230]] + self.assertEqual(zppm, list(range(225))) + + # SOT: start of tile part + self.assertEqual(c.segment[230].Isot, 0) + self.assertEqual(c.segment[230].Psot, 580) + self.assertEqual(c.segment[230].TPsot, 0) + self.assertEqual(c.segment[230].TNsot, 1) + + # 225 total SOT segments + Isot = [x.Isot for x in c.segment if x.id == 'SOT'] + self.assertEqual(Isot, list(range(225))) + + # scads of SOP, EPH segments + sop = [x.id for x in c.segment if x.id == 'SOP'] + eph = [x.id for x in c.segment if x.id == 'EPH'] + self.assertEqual(len(sop), 26472) + self.assertEqual(len(eph), 0) + + # EOC: end of codestream + self.assertEqual(c.segment[-1].id, 'EOC') + + def test_NR_p1_06_dump(self): + jfile = os.path.join(data_root, 'input/conformance/p1_06.j2k') + c = Jp2k(jfile).get_codestream(header_only=False) + + # SIZ: Image and tile size + # Profile: "1" means profile 1 + self.assertEqual(c.segment[1].Rsiz, 2) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 12) + self.assertEqual(c.segment[1].Ysiz, 12) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (3, 3)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8, 8, 8)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 3) + + # COD: Coding style default + self.assertTrue(c.segment[2].Scod & 2) # sop + self.assertTrue(c.segment[2].Scod & 4) # eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.PCRL) + self.assertEqual(c.segment[2]._layers, 1) # layers = 1 + self.assertEqual(c.segment[2].SPcod[3], 1) # mct + self.assertEqual(c.segment[2].SPcod[4], 4) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), (32, 64)) + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertTrue(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertTrue(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + # quantization type + self.assertEqual(c.segment[3].Sqcd & 0x1f, 2) # expounded + self.assertEqual(c.segment[3]._guardBits, 3) + self.assertEqual(c.segment[3]._mantissa, + [1821, 1845, 1845, 1868, 1925, 1925, 2007, 32, + 32, 131, 2002, 2002, 1888]) + self.assertEqual(c.segment[3]._exponent, + [14, 14, 14, 14, 13, 13, 13, 11, 11, 11, + 11, 11, 11]) + + # COM: comment + # Registration + self.assertEqual(c.segment[4].Rcme, glymur.core.RCME_ISO_8859_1) + # Comment value + self.assertEqual(c.segment[4].Ccme.decode('latin-1'), + "Creator: AV-J2K (c) 2000,2001 Algo Vision") + + # SOT: start of tile part + self.assertEqual(c.segment[5].Isot, 0) + self.assertEqual(c.segment[5].Psot, 349) + self.assertEqual(c.segment[5].TPsot, 0) + self.assertEqual(c.segment[5].TNsot, 1) + + # PPT: packed packet headers, tile-part header + self.assertEqual(c.segment[6].id, 'PPT') + self.assertEqual(c.segment[6].Zppt, 0) + + # scads of SOP, EPH segments + + # 16 SOD segments + sods = [x for x in c.segment if x.id == 'SOD'] + self.assertEqual(len(sods), 16) + + # 16 PPT segments + ppts = [x for x in c.segment if x.id == 'PPT'] + self.assertEqual(len(ppts), 16) + + # 16 SOT segments + Isots = [x.Isot for x in c.segment if x.id == 'SOT'] + self.assertEqual(Isots, list(range(16))) + + # EOC: end of codestream + self.assertEqual(c.segment[-1].id, 'EOC') + + def test_NR_p1_07_dump(self): + jfile = os.path.join(data_root, 'input/conformance/p1_07.j2k') + c = Jp2k(jfile).get_codestream(header_only=False) + + # SIZ: Image and tile size + # Profile: "1" means profile 1 + self.assertEqual(c.segment[1].Rsiz, 2) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 12) + self.assertEqual(c.segment[1].Ysiz, 12) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (4, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (12, 12)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (4, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8, 8)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(4, 1), (1, 1)]) + + # COD: Coding style default + self.assertTrue(c.segment[2].Scod & 2) # sop + self.assertTrue(c.segment[2].Scod & 4) # eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.RPCL) + self.assertEqual(c.segment[2]._layers, 1) # layers = 1 + self.assertEqual(c.segment[2].SPcod[3], 0) # mct + self.assertEqual(c.segment[2].SPcod[4], 1) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), (64, 64)) + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(c.segment[2]._precinct_size, [(1, 1), (2, 2)]) + + # COC: Coding style component + self.assertEqual(c.segment[3].Ccoc, 1) + self.assertEqual(c.segment[3].SPcoc[0], 1) # level + self.assertEqual(tuple(c.segment[3]._code_block_size), (64, 64)) + # Selective arithmetic coding bypass + self.assertFalse(c.segment[3].SPcoc[3] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[3].SPcoc[3] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[3].SPcoc[3] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[3].SPcoc[3] & 0x08) + # Predictable termination + self.assertFalse(c.segment[3].SPcoc[3] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[3].SPcoc[3] & 0x0020) + self.assertEqual(c.segment[3].SPcoc[4], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(c.segment[3]._precinct_size, [(2, 2), (4, 4)]) + + # QCD: Quantization default + # quantization type + self.assertEqual(c.segment[4].Sqcd & 0x1f, 0) # none + self.assertEqual(c.segment[4]._guardBits, 2) + self.assertEqual(c.segment[4]._mantissa, [0] * 4) + self.assertEqual(c.segment[4]._exponent, [8, 9, 9, 10]) + + # COM: comment + # Registration + self.assertEqual(c.segment[5].Rcme, glymur.core.RCME_ISO_8859_1) + # Comment value + self.assertEqual(c.segment[5].Ccme.decode('latin-1'), + "Creator: AV-J2K (c) 2000,2001 Algo Vision") + + # SOT: start of tile part + self.assertEqual(c.segment[6].Isot, 0) + self.assertEqual(c.segment[6].Psot, 434) + self.assertEqual(c.segment[6].TPsot, 0) + self.assertEqual(c.segment[6].TNsot, 1) + + # scads of SOP, EPH segments + + # EOC: end of codestream + self.assertEqual(c.segment[-1].id, 'EOC') + + def test_NR_file1_dump(self): + jfile = os.path.join(data_root, 'input/conformance/file1.jp2') + jp2 = Jp2k(jfile) + + ids = [box.id for box in jp2.box] + self.assertEqual(ids, ['jP ', 'ftyp', 'xml ', 'jp2h', 'xml ', + 'jp2c']) + + ids = [box.id for box in jp2.box[3].box] + self.assertEqual(ids, ['ihdr', 'colr']) + + # Signature box. Check for corruption. + self.assertEqual(jp2.box[0].signature, (13, 10, 135, 10)) + + # File type box. + self.assertEqual(jp2.box[1].brand, 'jp2 ') + self.assertEqual(jp2.box[1].minor_version, 0) + self.assertEqual(jp2.box[1].compatibility_list[1], 'jp2 ') + + # XML box + tags = [x.tag for x in jp2.box[2].xml] + self.assertEqual(tags, + ['{http://www.jpeg.org/jpx/1.0/xml}' + + 'GENERAL_CREATION_INFO']) + + # Jp2 Header + # Image header + self.assertEqual(jp2.box[3].box[0].height, 512) + self.assertEqual(jp2.box[3].box[0].width, 768) + self.assertEqual(jp2.box[3].box[0].num_components, 3) + self.assertEqual(jp2.box[3].box[0].bits_per_component, 8) + self.assertEqual(jp2.box[3].box[0].signed, False) + self.assertEqual(jp2.box[3].box[0].compression, 7) # wavelet + self.assertEqual(jp2.box[3].box[0].cspace_unknown, False) + self.assertEqual(jp2.box[3].box[0].ip_provided, False) + + # Jp2 Header + # Colour specification + self.assertEqual(jp2.box[3].box[1].method, 1) + self.assertEqual(jp2.box[3].box[1].precedence, 0) + self.assertEqual(jp2.box[3].box[1].approximation, 1) # JPX exact ?? + self.assertEqual(jp2.box[3].box[1].color_space, glymur.core.SRGB) + + # XML box + tags = [x.tag for x in jp2.box[4].xml] + self.assertEqual(tags, ['{http://www.jpeg.org/jpx/1.0/xml}CAPTION', + '{http://www.jpeg.org/jpx/1.0/xml}LOCATION', + '{http://www.jpeg.org/jpx/1.0/xml}EVENT']) + + def test_NR_file2_dump(self): + jfile = os.path.join(data_root, 'input/conformance/file2.jp2') + jp2 = Jp2k(jfile) + + ids = [box.id for box in jp2.box] + self.assertEqual(ids, ['jP ', 'ftyp', 'jp2h', 'jp2c']) + + ids = [box.id for box in jp2.box[2].box] + self.assertEqual(ids, ['ihdr', 'colr', 'cdef']) + + # Signature box. Check for corruption. + self.assertEqual(jp2.box[0].signature, (13, 10, 135, 10)) + + # File type box. + self.assertEqual(jp2.box[1].brand, 'jp2 ') + self.assertEqual(jp2.box[1].minor_version, 0) + self.assertEqual(jp2.box[1].compatibility_list[1], 'jp2 ') + + # Jp2 Header + # Image header + self.assertEqual(jp2.box[2].box[0].height, 640) + self.assertEqual(jp2.box[2].box[0].width, 480) + self.assertEqual(jp2.box[2].box[0].num_components, 3) + self.assertEqual(jp2.box[2].box[0].bits_per_component, 8) + self.assertEqual(jp2.box[2].box[0].signed, False) + self.assertEqual(jp2.box[2].box[0].compression, 7) # wavelet + self.assertEqual(jp2.box[2].box[0].cspace_unknown, False) + self.assertEqual(jp2.box[2].box[0].ip_provided, False) + + # Jp2 Header + # Colour specification + self.assertEqual(jp2.box[2].box[1].method, 1) + self.assertEqual(jp2.box[2].box[1].precedence, 0) + self.assertEqual(jp2.box[2].box[1].approximation, 1) # JPX exact?? + self.assertEqual(jp2.box[2].box[1].color_space, glymur.core.YCC) + + # Jp2 Header + # Channel Definition + self.assertEqual(jp2.box[2].box[2].component_number, (0, 1, 2)) + self.assertEqual(jp2.box[2].box[2].component_type, (0, 0, 0)) # color + self.assertEqual(jp2.box[2].box[2].association, (3, 2, 1)) # reverse + + def test_NR_file3_dump(self): + # Three 8-bit components in the sRGB-YCC colourspace, with the Cb and + # Cr components being subsampled 2x in both the horizontal and + # vertical directions. The components are stored in the standard + # order. + jfile = os.path.join(data_root, 'input/conformance/file3.jp2') + jp2 = Jp2k(jfile) + + ids = [box.id for box in jp2.box] + self.assertEqual(ids, ['jP ', 'ftyp', 'jp2h', 'jp2c']) + + ids = [box.id for box in jp2.box[2].box] + self.assertEqual(ids, ['ihdr', 'colr']) + + # Signature box. Check for corruption. + self.assertEqual(jp2.box[0].signature, (13, 10, 135, 10)) + + # File type box. + self.assertEqual(jp2.box[1].brand, 'jp2 ') + self.assertEqual(jp2.box[1].minor_version, 0) + self.assertEqual(jp2.box[1].compatibility_list[1], 'jp2 ') + + # Jp2 Header + # Image header + self.assertEqual(jp2.box[2].box[0].height, 640) + self.assertEqual(jp2.box[2].box[0].width, 480) + self.assertEqual(jp2.box[2].box[0].num_components, 3) + self.assertEqual(jp2.box[2].box[0].bits_per_component, 8) + self.assertEqual(jp2.box[2].box[0].signed, False) + self.assertEqual(jp2.box[2].box[0].compression, 7) # wavelet + self.assertEqual(jp2.box[2].box[0].cspace_unknown, False) + self.assertEqual(jp2.box[2].box[0].ip_provided, False) + + # Jp2 Header + # Colour specification + self.assertEqual(jp2.box[2].box[1].method, 1) + self.assertEqual(jp2.box[2].box[1].precedence, 0) + self.assertEqual(jp2.box[2].box[1].approximation, 1) # JPX exact + self.assertEqual(jp2.box[2].box[1].color_space, glymur.core.YCC) + + # sub-sampling + codestream = jp2.get_codestream() + self.assertEqual(codestream.segment[1].XRsiz[0], 1) + self.assertEqual(codestream.segment[1].YRsiz[0], 1) + self.assertEqual(codestream.segment[1].XRsiz[1], 2) + self.assertEqual(codestream.segment[1].YRsiz[1], 2) + self.assertEqual(codestream.segment[1].XRsiz[2], 2) + self.assertEqual(codestream.segment[1].YRsiz[2], 2) + + def test_NR_file4_dump(self): + # One 8-bit component in the sRGB-grey colourspace. + jfile = os.path.join(data_root, 'input/conformance/file4.jp2') + jp2 = Jp2k(jfile) + + ids = [box.id for box in jp2.box] + self.assertEqual(ids, ['jP ', 'ftyp', 'jp2h', 'jp2c']) + + ids = [box.id for box in jp2.box[2].box] + self.assertEqual(ids, ['ihdr', 'colr']) + + # Signature box. Check for corruption. + self.assertEqual(jp2.box[0].signature, (13, 10, 135, 10)) + + # File type box. + self.assertEqual(jp2.box[1].brand, 'jp2 ') + self.assertEqual(jp2.box[1].minor_version, 0) + self.assertEqual(jp2.box[1].compatibility_list[1], 'jp2 ') + + # Jp2 Header + # Image header + self.assertEqual(jp2.box[2].box[0].height, 512) + self.assertEqual(jp2.box[2].box[0].width, 768) + self.assertEqual(jp2.box[2].box[0].num_components, 1) + self.assertEqual(jp2.box[2].box[0].bits_per_component, 8) + self.assertEqual(jp2.box[2].box[0].signed, False) + self.assertEqual(jp2.box[2].box[0].compression, 7) # wavelet + self.assertEqual(jp2.box[2].box[0].cspace_unknown, False) + self.assertEqual(jp2.box[2].box[0].ip_provided, False) + + # Jp2 Header + # Colour specification + self.assertEqual(jp2.box[2].box[1].method, 1) + self.assertEqual(jp2.box[2].box[1].precedence, 0) + self.assertEqual(jp2.box[2].box[1].approximation, 1) # JPX exact? + self.assertEqual(jp2.box[2].box[1].color_space, glymur.core.GREYSCALE) + + def test_NR_file5_dump(self): + # Three 8-bit components in the ROMM-RGB colourspace, encapsulated in a + # JP2 compatible JPX file. The components have been transformed using + # the RCT. The colourspace is specified using both a Restricted ICC + # profile and using the JPX-defined enumerated code for the ROMM-RGB + # colourspace. + jfile = os.path.join(data_root, 'input/conformance/file5.jp2') + jp2 = Jp2k(jfile) + + ids = [box.id for box in jp2.box] + self.assertEqual(ids, ['jP ', 'ftyp', 'rreq', 'jp2h', 'jp2c']) + + ids = [box.id for box in jp2.box[3].box] + self.assertEqual(ids, ['ihdr', 'colr', 'colr']) + + # Signature box. Check for corruption. + self.assertEqual(jp2.box[0].signature, (13, 10, 135, 10)) + + # File type box. + self.assertEqual(jp2.box[1].brand, 'jpx ') + self.assertEqual(jp2.box[1].minor_version, 0) + self.assertEqual(jp2.box[1].compatibility_list[1], 'jp2 ') + self.assertEqual(jp2.box[1].compatibility_list[2], 'jpx ') + self.assertEqual(jp2.box[1].compatibility_list[3], 'jpxb') + + # Jp2 Header + # Image header + self.assertEqual(jp2.box[3].box[0].height, 512) + self.assertEqual(jp2.box[3].box[0].width, 768) + self.assertEqual(jp2.box[3].box[0].num_components, 3) + self.assertEqual(jp2.box[3].box[0].signed, False) + self.assertEqual(jp2.box[3].box[0].compression, 7) # wavelet + self.assertEqual(jp2.box[3].box[0].cspace_unknown, False) + self.assertEqual(jp2.box[3].box[0].ip_provided, False) + + # Jp2 Header + # Colour specification + self.assertEqual(jp2.box[3].box[1].method, 2) # enumerated + self.assertEqual(jp2.box[3].box[1].precedence, 0) + self.assertEqual(jp2.box[3].box[1].approximation, 1) # JPX exact + self.assertEqual(len(jp2.box[3].box[1].icc_profile), 546) + self.assertIsNone(jp2.box[3].box[1].color_space) + + # Jp2 Header + # Colour specification + self.assertEqual(jp2.box[3].box[2].method, 1) # enumerated + self.assertEqual(jp2.box[3].box[2].precedence, 1) + self.assertEqual(jp2.box[3].box[2].approximation, 1) # JPX exact + self.assertIsNone(jp2.box[3].box[2].icc_profile) + self.assertEqual(jp2.box[3].box[2].color_space, + glymur.core.ROMM_RGB) + + def test_NR_file6_dump(self): + jfile = os.path.join(data_root, 'input/conformance/file6.jp2') + jp2 = Jp2k(jfile) + + ids = [box.id for box in jp2.box] + self.assertEqual(ids, ['jP ', 'ftyp', 'jp2h', 'jp2c']) + + ids = [box.id for box in jp2.box[2].box] + self.assertEqual(ids, ['ihdr', 'colr']) + + # Signature box. Check for corruption. + self.assertEqual(jp2.box[0].signature, (13, 10, 135, 10)) + + # File type box. + self.assertEqual(jp2.box[1].brand, 'jp2 ') + self.assertEqual(jp2.box[1].minor_version, 0) + self.assertEqual(jp2.box[1].compatibility_list[1], 'jp2 ') + + # Jp2 Header + # Image header + self.assertEqual(jp2.box[2].box[0].height, 512) + self.assertEqual(jp2.box[2].box[0].width, 768) + self.assertEqual(jp2.box[2].box[0].num_components, 1) + self.assertEqual(jp2.box[2].box[0].bits_per_component, 12) + self.assertEqual(jp2.box[2].box[0].signed, False) + self.assertEqual(jp2.box[2].box[0].compression, 7) # wavelet + self.assertEqual(jp2.box[2].box[0].cspace_unknown, False) + self.assertEqual(jp2.box[2].box[0].ip_provided, False) + + # Jp2 Header + # Colour specification + self.assertEqual(jp2.box[2].box[1].method, 1) + self.assertEqual(jp2.box[2].box[1].precedence, 0) + self.assertEqual(jp2.box[2].box[1].approximation, 1) # JPX exact + self.assertIsNone(jp2.box[2].box[1].icc_profile) + self.assertEqual(jp2.box[2].box[1].color_space, + glymur.core.GREYSCALE) + + def test_NR_file7_dump(self): + # Three 16-bit components in the e-sRGB colourspace, encapsulated in a + # JP2 compatible JPX file. The components have been transformed using + # the RCT. The colourspace is specified using both a Restricted ICC + # profile and using the JPX-defined enumerated code for the e-sRGB + # colourspace. + jfile = os.path.join(data_root, 'input/conformance/file7.jp2') + jp2 = Jp2k(jfile) + + ids = [box.id for box in jp2.box] + self.assertEqual(ids, ['jP ', 'ftyp', 'rreq', 'jp2h', 'jp2c']) + + ids = [box.id for box in jp2.box[3].box] + self.assertEqual(ids, ['ihdr', 'colr', 'colr']) + + # Signature box. Check for corruption. + self.assertEqual(jp2.box[0].signature, (13, 10, 135, 10)) + + # File type box. + self.assertEqual(jp2.box[1].brand, 'jpx ') + self.assertEqual(jp2.box[1].compatibility_list[1], 'jp2 ') + self.assertEqual(jp2.box[1].compatibility_list[2], 'jpx ') + self.assertEqual(jp2.box[1].compatibility_list[3], 'jpxb') + self.assertEqual(jp2.box[1].minor_version, 0) + + # Reader requirements talk. + self.assertTrue(glymur.core.RREQ_E_SRGB_ENUMERATED_COLORSPACE + in jp2.box[2].standard_flag) + + # Jp2 Header + # Image header + self.assertEqual(jp2.box[3].box[0].height, 640) + self.assertEqual(jp2.box[3].box[0].width, 480) + self.assertEqual(jp2.box[3].box[0].num_components, 3) + self.assertEqual(jp2.box[3].box[0].bits_per_component, 16) + self.assertEqual(jp2.box[3].box[0].signed, False) + self.assertEqual(jp2.box[3].box[0].compression, 7) # wavelet + self.assertEqual(jp2.box[3].box[0].cspace_unknown, False) + self.assertEqual(jp2.box[3].box[0].ip_provided, False) + + # Jp2 Header + # Colour specification + self.assertEqual(jp2.box[3].box[1].method, 2) + self.assertEqual(jp2.box[3].box[1].precedence, 0) + self.assertEqual(jp2.box[3].box[1].approximation, 1) # JPX exact + self.assertEqual(len(jp2.box[3].box[1].icc_profile), 13332) + self.assertIsNone(jp2.box[3].box[1].color_space) + + # Jp2 Header + # Colour specification + self.assertEqual(jp2.box[3].box[2].method, 1) # enumerated cspace + self.assertEqual(jp2.box[3].box[2].precedence, 1) + self.assertEqual(jp2.box[3].box[2].approximation, 1) # JPX exact + self.assertIsNone(jp2.box[3].box[2].icc_profile) + self.assertEqual(jp2.box[3].box[2].color_space, + glymur.core.E_SRGB) + + def test_NR_file8_dump(self): + # One 8-bit component in a gamma 1.8 space. The colourspace is + # specified using a Restricted ICC profile. + jfile = os.path.join(data_root, 'input/conformance/file8.jp2') + jp2 = Jp2k(jfile) + + ids = [box.id for box in jp2.box] + self.assertEqual(ids, ['jP ', 'ftyp', 'jp2h', 'xml ', 'jp2c', + 'xml ']) + + ids = [box.id for box in jp2.box[2].box] + self.assertEqual(ids, ['ihdr', 'colr']) + + # Signature box. Check for corruption. + self.assertEqual(jp2.box[0].signature, (13, 10, 135, 10)) + + # File type box. + self.assertEqual(jp2.box[1].brand, 'jp2 ') + self.assertEqual(jp2.box[1].compatibility_list[1], 'jp2 ') + self.assertEqual(jp2.box[1].minor_version, 0) + + # Jp2 Header + # Image header + self.assertEqual(jp2.box[2].box[0].height, 400) + self.assertEqual(jp2.box[2].box[0].width, 700) + self.assertEqual(jp2.box[2].box[0].num_components, 1) + self.assertEqual(jp2.box[2].box[0].bits_per_component, 8) + self.assertEqual(jp2.box[2].box[0].signed, False) + self.assertEqual(jp2.box[2].box[0].compression, 7) # wavelet + self.assertEqual(jp2.box[2].box[0].cspace_unknown, False) + self.assertEqual(jp2.box[2].box[0].ip_provided, False) + + # Jp2 Header + # Colour specification + self.assertEqual(jp2.box[2].box[1].method, 2) # enumerated + self.assertEqual(jp2.box[2].box[1].precedence, 0) + self.assertEqual(jp2.box[2].box[1].approximation, 1) # JPX exact + self.assertEqual(len(jp2.box[2].box[1].icc_profile), 414) + self.assertIsNone(jp2.box[2].box[1].color_space) + + # XML box + tags = [x.tag for x in jp2.box[3].xml] + self.assertEqual(tags, + ['{http://www.jpeg.org/jpx/1.0/xml}' + + 'GENERAL_CREATION_INFO']) + + # XML box + tags = [x.tag for x in jp2.box[5].xml] + self.assertEqual(tags, + ['{http://www.jpeg.org/jpx/1.0/xml}CAPTION', + '{http://www.jpeg.org/jpx/1.0/xml}LOCATION', + '{http://www.jpeg.org/jpx/1.0/xml}THING', + '{http://www.jpeg.org/jpx/1.0/xml}EVENT']) + + def test_NR_file9_dump(self): + # Colormap + jfile = os.path.join(data_root, 'input/conformance/file9.jp2') + jp2 = Jp2k(jfile) + + ids = [box.id for box in jp2.box] + self.assertEqual(ids, ['jP ', 'ftyp', 'jp2h', 'jp2c']) + + ids = [box.id for box in jp2.box[2].box] + self.assertEqual(ids, ['ihdr', 'pclr', 'cmap', 'colr']) + + # Signature box. Check for corruption. + self.assertEqual(jp2.box[0].signature, (13, 10, 135, 10)) + + # File type box. + self.assertEqual(jp2.box[1].brand, 'jp2 ') + self.assertEqual(jp2.box[1].compatibility_list[1], 'jp2 ') + self.assertEqual(jp2.box[1].minor_version, 0) + + # Jp2 Header + # Image header + self.assertEqual(jp2.box[2].box[0].height, 512) + self.assertEqual(jp2.box[2].box[0].width, 768) + self.assertEqual(jp2.box[2].box[0].num_components, 1) + self.assertEqual(jp2.box[2].box[0].bits_per_component, 8) + self.assertEqual(jp2.box[2].box[0].signed, False) + self.assertEqual(jp2.box[2].box[0].compression, 7) # wavelet + self.assertEqual(jp2.box[2].box[0].cspace_unknown, False) + self.assertEqual(jp2.box[2].box[0].ip_provided, False) + + # Palette box. + self.assertEqual(len(jp2.box[2].box[1].palette), 3) + self.assertEqual(len(jp2.box[2].box[1].palette[0]), 256) + self.assertEqual(len(jp2.box[2].box[1].palette[1]), 256) + self.assertEqual(len(jp2.box[2].box[1].palette[2]), 256) + np.testing.assert_array_equal(jp2.box[2].box[1].palette[0][0], 0) + np.testing.assert_array_equal(jp2.box[2].box[1].palette[1][0], 0) + np.testing.assert_array_equal(jp2.box[2].box[1].palette[2][0], 0) + np.testing.assert_array_equal(jp2.box[2].box[1].palette[0][128], 73) + np.testing.assert_array_equal(jp2.box[2].box[1].palette[1][128], 92) + np.testing.assert_array_equal(jp2.box[2].box[1].palette[2][128], 53) + np.testing.assert_array_equal(jp2.box[2].box[1].palette[0][-1], 245) + np.testing.assert_array_equal(jp2.box[2].box[1].palette[1][-1], 245) + np.testing.assert_array_equal(jp2.box[2].box[1].palette[2][-1], 245) + + # Component mapping box + self.assertEqual(jp2.box[2].box[2].component_index, (0, 0, 0)) + self.assertEqual(jp2.box[2].box[2].mapping_type, (1, 1, 1)) + self.assertEqual(jp2.box[2].box[2].palette_index, (0, 1, 2)) + + # Jp2 Header + # Colour specification + self.assertEqual(jp2.box[2].box[3].method, 1) + self.assertEqual(jp2.box[2].box[3].precedence, 0) + self.assertEqual(jp2.box[2].box[3].approximation, 1) # JPX exact + self.assertIsNone(jp2.box[2].box[3].icc_profile) + self.assertEqual(jp2.box[2].box[3].color_space, glymur.core.SRGB) + + def test_NR_00042_j2k_dump(self): + # Profile 3. + jfile = os.path.join(data_root, 'input/nonregression/_00042.j2k') + jp2k = Jp2k(jfile) + c = jp2k.get_codestream(header_only=False) + + # SIZ: Image and tile size + # Profile: "3" means profile 3 + self.assertEqual(c.segment[1].Rsiz, 3) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 1920) + self.assertEqual(c.segment[1].Ysiz, 1080) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), + (1920, 1080)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (12, 12, 12)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 3) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.CPRL) + self.assertEqual(c.segment[2]._layers, 1) # layers = 1 + self.assertEqual(c.segment[2].SPcod[3], 1) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), (32, 32)) + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE) + self.assertEqual(c.segment[2]._precinct_size[0], (128, 128)) + self.assertEqual(c.segment[2]._precinct_size[1:], [(256, 256)] * 5) + + # QCD: Quantization default + # quantization type + self.assertEqual(c.segment[3].Sqcd & 0x1f, 2) + self.assertEqual(c.segment[3]._guardBits, 2) + self.assertEqual(c.segment[3]._mantissa, + [1824, 1776, 1776, 1728, 1792, 1792, 1760, 1872, + 1872, 1896, 5, 5, 71, 2003, 2003, 1890]) + self.assertEqual(c.segment[3]._exponent, + [18, 18, 18, 18, 17, 17, 17, 16, + 16, 16, 14, 14, 14, 14, 14, 14]) + + # COC: Coding style component + self.assertEqual(c.segment[4].Ccoc, 1) + self.assertEqual(c.segment[4].SPcoc[0], 5) # level + self.assertEqual(tuple(c.segment[4]._code_block_size), (32, 32)) + # Selective arithmetic coding bypass + self.assertFalse(c.segment[4].SPcoc[3] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[4].SPcoc[3] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[4].SPcoc[3] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[4].SPcoc[3] & 0x08) + # Predictable termination + self.assertFalse(c.segment[4].SPcoc[3] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[4].SPcoc[3] & 0x0020) + self.assertEqual(c.segment[4].SPcoc[4], + glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE) + + # QCC: Quantization component + # associated component + self.assertEqual(c.segment[5].Cqcc, 1) + self.assertEqual(c.segment[5]._guardBits, 2) + # quantization type + self.assertEqual(c.segment[5].Sqcc & 0x1f, 2) + self.assertEqual(c.segment[5]._mantissa, + [1824, 1776, 1776, 1728, 1792, 1792, 1760, 1872, + 1872, 1896, 5, 5, 71, 2003, 2003, 1890]) + self.assertEqual(c.segment[5]._exponent, + [18, 18, 18, 18, 17, 17, 17, 16, 16, 16, 14, 14, 14, + 14, 14, 14]) + + # COC: Coding style component + self.assertEqual(c.segment[6].Ccoc, 2) + self.assertEqual(c.segment[6].SPcoc[0], 5) # level + self.assertEqual(tuple(c.segment[6]._code_block_size), (32, 32)) + # Selective arithmetic coding bypass + self.assertFalse(c.segment[6].SPcoc[3] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[6].SPcoc[3] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[6].SPcoc[3] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[6].SPcoc[3] & 0x08) + # Predictable termination + self.assertFalse(c.segment[6].SPcoc[3] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[6].SPcoc[3] & 0x0020) + self.assertEqual(c.segment[6].SPcoc[4], + glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE) + + # QCC: Quantization component + # associated component + self.assertEqual(c.segment[7].Cqcc, 2) + self.assertEqual(c.segment[7]._guardBits, 2) + # quantization type + self.assertEqual(c.segment[7].Sqcc & 0x1f, 2) # none + self.assertEqual(c.segment[7]._mantissa, + [1824, 1776, 1776, 1728, 1792, 1792, 1760, 1872, + 1872, 1896, 5, 5, 71, 2003, 2003, 1890]) + self.assertEqual(c.segment[7]._exponent, + [18, 18, 18, 18, 17, 17, 17, 16, 16, 16, 14, 14, + 14, 14, 14, 14]) + + # COM: comment + # Registration + self.assertEqual(c.segment[8].Rcme, glymur.core.RCME_ISO_8859_1) + # Comment value + self.assertEqual(c.segment[8].Ccme.decode('latin-1'), + "Created by OpenJPEG version 1.3.0") + + # TLM (tile-part length) + self.assertEqual(c.segment[9].Ztlm, 0) + self.assertEqual(c.segment[9].Ttlm, (0, 0, 0)) + self.assertEqual(c.segment[9].Ptlm, (45274, 20838, 8909)) + + # 3 tiles, one for each component + idx = [x.Isot for x in c.segment if x.id == 'SOT'] + self.assertEqual(idx, [0, 0, 0]) + lens = [x.Psot for x in c.segment if x.id == 'SOT'] + self.assertEqual(lens, [45274, 20838, 8909]) + TPsot = [x.TPsot for x in c.segment if x.id == 'SOT'] + self.assertEqual(TPsot, [0, 1, 2]) + + sods = [x for x in c.segment if x.id == 'SOD'] + self.assertEqual(len(sods), 3) + + # EOC: end of codestream + self.assertEqual(c.segment[-1].id, 'EOC') + + def test_Bretagne2_j2k_dump(self): + # Profile 3. + jfile = os.path.join(data_root, 'input/nonregression/Bretagne2.j2k') + jp2k = Jp2k(jfile) + c = jp2k.get_codestream(header_only=False) + + # SIZ: Image and tile size + # Profile: "3" means profile 3 + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 2592) + self.assertEqual(c.segment[1].Ysiz, 1944) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (640, 480)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8, 8, 8)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 3) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 3) # layers = 3 + self.assertEqual(c.segment[2].SPcod[3], 1) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), (32, 32)) + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(c.segment[2]._precinct_size, + [(16, 16), (32, 32), (64, 64), (128, 128), + (128, 128), (128, 128)]) + + ids = [x.id for x in c.segment] + expected = ['SOC', 'SIZ', 'COD', 'QCD', 'CME'] + expected += ['SOT', 'COC', 'QCC', 'COC', 'QCC', 'SOD'] * 25 + expected += ['EOC'] + self.assertEqual(ids, expected) + + def test_NR_buxI_j2k_dump(self): + jfile = os.path.join(data_root, 'input/nonregression/buxI.j2k') + jp2k = Jp2k(jfile) + c = jp2k.get_codestream(header_only=False) + + # SIZ: Image and tile size + # Profile: + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 512) + self.assertEqual(c.segment[1].Ysiz, 512) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (512, 512)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (16,)) + # signed + self.assertEqual(c.segment[1]._signed, (False,)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 1) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 2) # layers = 2 + self.assertEqual(c.segment[2].SPcod[3], 0) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), (64, 64)) + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + ids = [x.id for x in c.segment] + expected = ['SOC', 'SIZ', 'COD', 'QCD', 'CME', 'SOT', 'SOD', 'EOC'] + self.assertEqual(ids, expected) + + def test_NR_buxR_j2k_dump(self): + jfile = os.path.join(data_root, 'input/nonregression/buxR.j2k') + jp2k = Jp2k(jfile) + c = jp2k.get_codestream(header_only=False) + + # SIZ: Image and tile size + # Profile: + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 512) + self.assertEqual(c.segment[1].Ysiz, 512) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (512, 512)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (16,)) + # signed + self.assertEqual(c.segment[1]._signed, (False,)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 1) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 2) # layers = 2 + self.assertEqual(c.segment[2].SPcod[3], 0) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), (64, 64)) + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + ids = [x.id for x in c.segment] + expected = ['SOC', 'SIZ', 'COD', 'QCD', 'CME', 'SOT', 'SOD', 'EOC'] + self.assertEqual(ids, expected) + + def test_NR_Cannotreaddatawithnosizeknown_j2k(self): + lst = ['input', 'nonregression', + 'Cannotreaddatawithnosizeknown.j2k'] + path = '/'.join(lst) + + jfile = os.path.join(data_root, path) + jp2k = Jp2k(jfile) + c = jp2k.get_codestream() + + ids = [x.id for x in c.segment] + expected = ['SOC', 'SIZ', 'COD', 'QCD'] + self.assertEqual(ids, expected) + + # SIZ: Image and tile size + # Profile: + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 1420) + self.assertEqual(c.segment[1].Ysiz, 1416) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), + (1420, 1416)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (16,)) + # signed + self.assertEqual(c.segment[1]._signed, (False,)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 1) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 1) # layers = 1 + self.assertEqual(c.segment[2].SPcod[3], 0) # mct + self.assertEqual(c.segment[2].SPcod[4], 11) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), (64, 64)) + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + # quantization type + self.assertEqual(c.segment[3].Sqcd & 0x1f, 0) + self.assertEqual(c.segment[3]._guardBits, 4) + self.assertEqual(c.segment[3]._mantissa, [0] * 34) + self.assertEqual(c.segment[3]._exponent, [16] + [17, 17, 18] * 11) + + def test_NR_CT_Phillips_JPEG2K_Decompr_Problem_dump(self): + jfile = os.path.join(data_root, + 'input/nonregression/' + + 'CT_Phillips_JPEG2K_Decompr_Problem.j2k') + jp2k = Jp2k(jfile) + c = jp2k.get_codestream() + + ids = [x.id for x in c.segment] + expected = ['SOC', 'SIZ', 'COD', 'QCD', 'CME'] + self.assertEqual(ids, expected) + + # SIZ: Image and tile size + # Profile: + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 512) + self.assertEqual(c.segment[1].Ysiz, 614) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (512, 614)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (12,)) + # signed + self.assertEqual(c.segment[1]._signed, (False,)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 1) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 1) # layers = 1 + self.assertEqual(c.segment[2].SPcod[3], 0) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), (64, 64)) + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + # quantization type + self.assertEqual(c.segment[3].Sqcd & 0x1f, 2) + self.assertEqual(c.segment[3]._guardBits, 1) + self.assertEqual(c.segment[3]._mantissa, + [442, 422, 422, 403, 422, 422, 403, 472, 472, 487, + 591, 591, 676, 558, 558, 485]) + self.assertEqual(c.segment[3]._exponent, + [22, 22, 22, 22, 21, 21, 21, 20, 20, 20, 19, 19, 19, + 18, 18, 18]) + + # COM: comment + # Registration + self.assertEqual(c.segment[4].Rcme, glymur.core.RCME_ISO_8859_1) + # Comment value + self.assertEqual(c.segment[4].Ccme.decode('latin-1'), "Kakadu-3.2") + + def test_NR_cthead1_dump(self): + jfile = os.path.join(data_root, + 'input/nonregression/cthead1.j2k') + jp2k = Jp2k(jfile) + c = jp2k.get_codestream() + + ids = [x.id for x in c.segment] + expected = ['SOC', 'SIZ', 'COD', 'QCD', 'CME', 'CME'] + self.assertEqual(ids, expected) + + # SIZ: Image and tile size + # Profile: + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 256) + self.assertEqual(c.segment[1].Ysiz, 256) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (256, 256)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8,)) + # signed + self.assertEqual(c.segment[1]._signed, (False,)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 1) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 1) # layers = 1 + self.assertEqual(c.segment[2].SPcod[3], 0) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), (64, 64)) + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + # quantization type + self.assertEqual(c.segment[3].Sqcd & 0x1f, 0) + self.assertEqual(c.segment[3]._guardBits, 1) + self.assertEqual(c.segment[3]._mantissa, [0] * 16) + self.assertEqual(c.segment[3]._exponent, + [9, 10, 10, 11, 10, 10, 11, 10, 10, 11, 10, 10, 10, + 9, 9, 10]) + + # COM: comment + # Registration + self.assertEqual(c.segment[4].Rcme, glymur.core.RCME_ISO_8859_1) + # Comment value + self.assertEqual(c.segment[4].Ccme.decode('latin-1'), "Kakadu-v6.3.1") + + # COM: comment + # Registration + self.assertEqual(c.segment[4].Rcme, glymur.core.RCME_ISO_8859_1) + # Comment value + self.assertEqual(c.segment[4].Ccme.decode('latin-1'), "Kakadu-v6.3.1") + + def test_NR_illegalcolortransform_dump(self): + jfile = os.path.join(data_root, + 'input/nonregression/illegalcolortransform.j2k') + jp2k = Jp2k(jfile) + c = jp2k.get_codestream() + + ids = [x.id for x in c.segment] + expected = ['SOC', 'SIZ', 'COD', 'QCD'] + self.assertEqual(ids, expected) + + # SIZ: Image and tile size + # Profile: + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 1420) + self.assertEqual(c.segment[1].Ysiz, 1416) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), + (1420, 1416)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (16,)) + # signed + self.assertEqual(c.segment[1]._signed, (False,)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 1) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 1) # layers = 1 + self.assertEqual(c.segment[2].SPcod[3], 1) # mct + self.assertEqual(c.segment[2].SPcod[4], 11) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), (64, 64)) + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + # quantization type + self.assertEqual(c.segment[3].Sqcd & 0x1f, 0) + self.assertEqual(c.segment[3]._guardBits, 4) + self.assertEqual(c.segment[3]._mantissa, [0] * 34) + self.assertEqual(c.segment[3]._exponent, [16] + [17, 17, 18] * 11) + + def test_NR_j2k32_dump(self): + jfile = os.path.join(data_root, 'input/nonregression/j2k32.j2k') + jp2k = Jp2k(jfile) + c = jp2k.get_codestream() + + ids = [x.id for x in c.segment] + expected = ['SOC', 'SIZ', 'COD', 'QCD', 'CME'] + self.assertEqual(ids, expected) + + # SIZ: Image and tile size + # Profile: + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 256) + self.assertEqual(c.segment[1].Ysiz, 256) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (256, 256)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8, 8, 8)) + # signed + self.assertEqual(c.segment[1]._signed, (True, True, True)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 3) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 1) # layers = 1 + self.assertEqual(c.segment[2].SPcod[3], 1) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), (64, 64)) + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + # quantization type + self.assertEqual(c.segment[3].Sqcd & 0x1f, 0) + self.assertEqual(c.segment[3]._guardBits, 2) + self.assertEqual(c.segment[3]._mantissa, [0] * 16) + self.assertEqual(c.segment[3]._exponent, [8, 9, 9, 10, 9, 9, 10, 9, 9, + 10, 9, 9, 10, 9, 9, 10]) + + # COM: comment + # Registration + self.assertEqual(c.segment[4].Rcme, glymur.core.RCME_BINARY) + # Comment value + self.assertEqual(len(c.segment[4].Ccme), 36) + + def test_NR_kakadu_v4_4_openjpegv2_broken_dump(self): + jfile = os.path.join(data_root, + 'input/nonregression/' + + 'kakadu_v4-4_openjpegv2_broken.j2k') + jp2k = Jp2k(jfile) + c = jp2k.get_codestream() + + # SIZ: Image and tile size + # Profile: + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 2048) + self.assertEqual(c.segment[1].Ysiz, 2500) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), + (2048, 2500)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (16,)) + # signed + self.assertEqual(c.segment[1]._signed, (False,)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 1) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 12) # layers = 12 + self.assertEqual(c.segment[2].SPcod[3], 0) # mct + self.assertEqual(c.segment[2].SPcod[4], 8) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), (64, 64)) + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + self.assertEqual(c.segment[3].Sqcd & 0x1f, 0) + self.assertEqual(c.segment[3]._guardBits, 1) + self.assertEqual(c.segment[3]._mantissa, [0] * 25) + self.assertEqual(c.segment[3]._exponent, + [17, 18, 18, 19, 18, 18, 19, 18, 18, 19, 18, 18, 19, + 18, 18, 19, 18, 18, 19, 18, 18, 19, 18, 18, 19]) + + # COM: comment + # Registration + self.assertEqual(c.segment[4].Rcme, glymur.core.RCME_ISO_8859_1) + # Comment value + self.assertEqual(c.segment[4].Ccme.decode('latin-1'), "Kakadu-v4.4") + + # COM: comment + # Registration + self.assertEqual(c.segment[5].Rcme, glymur.core.RCME_ISO_8859_1) + # Comment value + expected = "Kdu-Layer-Info: log_2{Delta-D(MSE)/[2^16*Delta-L(bytes)]}," + expected += " L(bytes)\n" + expected += " -65.4, 6.8e+004\n" + expected += " -66.3, 1.0e+005\n" + expected += " -67.3, 2.0e+005\n" + expected += " -68.5, 4.1e+005\n" + expected += " -69.0, 5.1e+005\n" + expected += " -69.5, 5.9e+005\n" + expected += " -69.7, 6.8e+005\n" + expected += " -70.3, 8.2e+005\n" + expected += " -70.8, 1.0e+006\n" + expected += " -71.9, 1.4e+006\n" + expected += " -73.8, 2.0e+006\n" + expected += "-256.0, 3.7e+006\n" + self.assertEqual(c.segment[5].Ccme.decode('latin-1'), expected) + + def test_NR_MarkerIsNotCompliant_j2k_dump(self): + jfile = os.path.join(data_root, + 'input/nonregression/MarkerIsNotCompliant.j2k') + jp2k = Jp2k(jfile) + c = jp2k.get_codestream() + + # SIZ: Image and tile size + # Profile: + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 1420) + self.assertEqual(c.segment[1].Ysiz, 1416) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), + (1420, 1416)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (16,)) + # signed + self.assertEqual(c.segment[1]._signed, (False,)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 1) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 1) # layers = 1 + self.assertEqual(c.segment[2].SPcod[3], 0) # mct + self.assertEqual(c.segment[2].SPcod[4], 11) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), (64, 64)) + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + self.assertEqual(c.segment[3].Sqcd & 0x1f, 0) + self.assertEqual(c.segment[3]._guardBits, 4) + self.assertEqual(c.segment[3]._mantissa, [0] * 34) + self.assertEqual(c.segment[3]._exponent, + [16, 17, 17, 18, 17, 17, 18, 17, 17, 18, 17, 17, 18, + 17, 17, 18, 17, 17, 18, 17, 17, 18, 17, 17, 18, 17, + 17, 18, 17, 17, 18, 17, 17, 18]) + + def test_NR_movie_00000(self): + jfile = os.path.join(data_root, + 'input/nonregression/movie_00000.j2k') + jp2k = Jp2k(jfile) + c = jp2k.get_codestream() + + # SIZ: Image and tile size + # Profile: + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 1920) + self.assertEqual(c.segment[1].Ysiz, 1080) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), + (1920, 1080)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8, 8, 8)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 3) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 1) # layers = 1 + self.assertEqual(c.segment[2].SPcod[3], 1) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), (64, 64)) + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + self.assertEqual(c.segment[3].Sqcd & 0x1f, 0) + self.assertEqual(c.segment[3]._guardBits, 2) + self.assertEqual(c.segment[3]._mantissa, [0] * 16) + self.assertEqual(c.segment[3]._exponent, + [8, 9, 9, 10, 9, 9, 10, 9, 9, 10, 9, 9, 10, 9, 9, 10]) + + def test_NR_movie_00001(self): + jfile = os.path.join(data_root, + 'input/nonregression/movie_00001.j2k') + jp2k = Jp2k(jfile) + c = jp2k.get_codestream() + + # SIZ: Image and tile size + # Profile: + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 1920) + self.assertEqual(c.segment[1].Ysiz, 1080) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), + (1920, 1080)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8, 8, 8)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 3) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 1) # layers = 1 + self.assertEqual(c.segment[2].SPcod[3], 1) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), (64, 64)) + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + self.assertEqual(c.segment[3].Sqcd & 0x1f, 0) + self.assertEqual(c.segment[3]._guardBits, 2) + self.assertEqual(c.segment[3]._mantissa, [0] * 16) + self.assertEqual(c.segment[3]._exponent, + [8, 9, 9, 10, 9, 9, 10, 9, 9, 10, 9, 9, 10, 9, 9, 10]) + + def test_NR_movie_00002(self): + jfile = os.path.join(data_root, + 'input/nonregression/movie_00002.j2k') + jp2k = Jp2k(jfile) + c = jp2k.get_codestream() + + # SIZ: Image and tile size + # Profile: + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 1920) + self.assertEqual(c.segment[1].Ysiz, 1080) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), + (1920, 1080)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8, 8, 8)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 3) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 1) # layers = 1 + self.assertEqual(c.segment[2].SPcod[3], 1) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), (64, 64)) + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + self.assertEqual(c.segment[3].Sqcd & 0x1f, 0) + self.assertEqual(c.segment[3]._guardBits, 2) + self.assertEqual(c.segment[3]._mantissa, [0] * 16) + self.assertEqual(c.segment[3]._exponent, + [8, 9, 9, 10, 9, 9, 10, 9, 9, 10, 9, 9, 10, 9, 9, 10]) + + def test_NR_orb_blue10_lin_j2k_dump(self): + jfile = os.path.join(data_root, + 'input/nonregression/orb-blue10-lin-j2k.j2k') + jp2k = Jp2k(jfile) + c = jp2k.get_codestream() + + ids = [x.id for x in c.segment] + expected = ['SOC', 'SIZ', 'COD', 'QCD'] + self.assertEqual(ids, expected) + + # SIZ: Image and tile size + # Profile: + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 117) + self.assertEqual(c.segment[1].Ysiz, 117) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (117, 117)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8, 8, 8, 8)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False, False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 4) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 1) # layers = 1 + self.assertEqual(c.segment[2].SPcod[3], 0) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), (64, 64)) + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + self.assertEqual(c.segment[3].Sqcd & 0x1f, 0) + self.assertEqual(c.segment[3]._guardBits, 2) + self.assertEqual(c.segment[3]._mantissa, [0] * 16) + self.assertEqual(c.segment[3]._exponent, + [8, 9, 9, 10, 9, 9, 10, 9, 9, 10, 9, 9, 10, 9, 9, 10]) + + def test_NR_orb_blue10_win_j2k_dump(self): + jfile = os.path.join(data_root, + 'input/nonregression/orb-blue10-win-j2k.j2k') + jp2k = Jp2k(jfile) + c = jp2k.get_codestream() + + ids = [x.id for x in c.segment] + expected = ['SOC', 'SIZ', 'COD', 'QCD'] + self.assertEqual(ids, expected) + + # SIZ: Image and tile size + # Profile: + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 117) + self.assertEqual(c.segment[1].Ysiz, 117) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (117, 117)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8, 8, 8, 8)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False, False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 4) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 1) # layers = 1 + self.assertEqual(c.segment[2].SPcod[3], 0) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), (64, 64)) + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + self.assertEqual(c.segment[3].Sqcd & 0x1f, 0) + self.assertEqual(c.segment[3]._guardBits, 2) + self.assertEqual(c.segment[3]._mantissa, [0] * 16) + self.assertEqual(c.segment[3]._exponent, + [8, 9, 9, 10, 9, 9, 10, 9, 9, 10, 9, 9, 10, 9, 9, 10]) + + def test_NR_pacs_ge_j2k_dump(self): + jfile = os.path.join(data_root, 'input/nonregression/pacs.ge.j2k') + jp2k = Jp2k(jfile) + c = jp2k.get_codestream() + + ids = [x.id for x in c.segment] + expected = ['SOC', 'SIZ', 'COD', 'QCD', 'CME'] + self.assertEqual(ids, expected) + + # SIZ: Image and tile size + # Profile: + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 512) + self.assertEqual(c.segment[1].Ysiz, 512) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (512, 512)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (16,)) + # signed + self.assertEqual(c.segment[1]._signed, (True,)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 1) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 16) # layers = 16 + self.assertEqual(c.segment[2].SPcod[3], 0) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), (64, 64)) + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + self.assertEqual(c.segment[3].Sqcd & 0x1f, 0) + self.assertEqual(c.segment[3]._guardBits, 1) + self.assertEqual(c.segment[3]._mantissa, [0] * 16) + self.assertEqual(c.segment[3]._exponent, + [18, 19, 19, 20, 19, 19, 20, 19, 19, 20, 19, 19, 20, + 19, 19, 20]) + + # COM: comment + # Registration + self.assertEqual(c.segment[4].Rcme, glymur.core.RCME_ISO_8859_1) + # Comment value + self.assertEqual(c.segment[4].Ccme.decode('latin-1'), + "Kakadu-2.0.2") + + def test_NR_test_lossless_j2k_dump(self): + jfile = os.path.join(data_root, + 'input/nonregression/test_lossless.j2k') + jp2k = Jp2k(jfile) + c = jp2k.get_codestream() + + ids = [x.id for x in c.segment] + expected = ['SOC', 'SIZ', 'COD', 'QCD', 'CME'] + self.assertEqual(ids, expected) + + # SIZ: Image and tile size + # Profile: + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 1024) + self.assertEqual(c.segment[1].Ysiz, 1024) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), + (1024, 1024)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (12,)) + # signed + self.assertEqual(c.segment[1]._signed, (False,)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 1) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 1) # layers = 1 + self.assertEqual(c.segment[2].SPcod[3], 0) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), (64, 64)) + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + self.assertEqual(c.segment[3].Sqcd & 0x1f, 0) + self.assertEqual(c.segment[3]._guardBits, 2) + self.assertEqual(c.segment[3]._mantissa, [0] * 16) + self.assertEqual(c.segment[3]._exponent, + [12, 13, 13, 14, 13, 13, 14, 13, 13, 14, 13, 13, 14, + 13, 13, 14]) + + # COM: comment + # Registration + self.assertEqual(c.segment[4].Rcme, glymur.core.RCME_ISO_8859_1) + # Comment value + self.assertEqual(c.segment[4].Ccme.decode('latin-1'), + "ClearCanvas DICOM OpenJPEG") + + def test_NR_123_j2c_dump(self): + jfile = os.path.join(data_root, 'input/nonregression/123.j2c') + jp2k = Jp2k(jfile) + c = jp2k.get_codestream() + + ids = [x.id for x in c.segment] + expected = ['SOC', 'SIZ', 'COD', 'QCD'] + self.assertEqual(ids, expected) + + # SIZ: Image and tile size + # Profile: + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 1800) + self.assertEqual(c.segment[1].Ysiz, 1800) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), + (1800, 1800)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (16,)) + # signed + self.assertEqual(c.segment[1]._signed, (False,)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 1) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 1) # layers = 1 + self.assertEqual(c.segment[2].SPcod[3], 1) # mct + self.assertEqual(c.segment[2].SPcod[4], 11) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), + (64, 64)) # cblk + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + self.assertEqual(c.segment[3].Sqcd & 0x1f, 0) + self.assertEqual(c.segment[3]._guardBits, 4) + self.assertEqual(c.segment[3]._mantissa, [0] * 34) + self.assertEqual(c.segment[3]._exponent, + [16] + [17, 17, 18] * 11) + + def test_NR_bug_j2c_dump(self): + jfile = os.path.join(data_root, 'input/nonregression/bug.j2c') + jp2k = Jp2k(jfile) + c = jp2k.get_codestream() + + ids = [x.id for x in c.segment] + expected = ['SOC', 'SIZ', 'COD', 'QCD'] + self.assertEqual(ids, expected) + + # SIZ: Image and tile size + # Profile: + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 1800) + self.assertEqual(c.segment[1].Ysiz, 1800) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), + (1800, 1800)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (16,)) + # signed + self.assertEqual(c.segment[1]._signed, (False,)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 1) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 1) # layers = 1 + self.assertEqual(c.segment[2].SPcod[3], 1) # mct + self.assertEqual(c.segment[2].SPcod[4], 11) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), + (64, 64)) # cblk + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + self.assertEqual(c.segment[3].Sqcd & 0x1f, 0) + self.assertEqual(c.segment[3]._guardBits, 4) + self.assertEqual(c.segment[3]._mantissa, [0] * 34) + self.assertEqual(c.segment[3]._exponent, + [16] + [17, 17, 18] * 11) + + def test_NR_kodak_2layers_lrcp_j2c_dump(self): + jfile = os.path.join(data_root, + 'input/nonregression/kodak_2layers_lrcp.j2c') + jp2k = Jp2k(jfile) + c = jp2k.get_codestream() + + ids = [x.id for x in c.segment] + expected = ['SOC', 'SIZ', 'COD', 'QCD', 'CME'] + self.assertEqual(ids, expected) + + # SIZ: Image and tile size + # Profile: + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 2048) + self.assertEqual(c.segment[1].Ysiz, 1556) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), + (2048, 1556)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (12, 12, 12)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 3) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 2) # layers = 2 + self.assertEqual(c.segment[2].SPcod[3], 1) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), + (32, 32)) # cblk + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE) + self.assertEqual(c.segment[2]._precinct_size, + [(128, 128)] + [(256, 256)] * 5) + + # QCD: Quantization default + self.assertEqual(c.segment[3].Sqcd & 0x1f, 2) + self.assertEqual(c.segment[3]._guardBits, 2) + self.assertEqual(c.segment[3]._mantissa, [0] * 16) + self.assertEqual(c.segment[3]._exponent, + [13, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, + 13, 13, 13]) + + # COM: comment + # Registration + self.assertEqual(c.segment[4].Rcme, glymur.core.RCME_ISO_8859_1) + # Comment value + self.assertEqual(c.segment[4].Ccme.decode('latin-1'), + "DCP-Werkstatt") + + @unittest.skipIf(sys.hexversion < 0x03020000, + "Uses features introduced in 3.2.") + def test_NR_broken_jp2_dump(self): + jfile = os.path.join(data_root, + 'input/nonregression/broken.jp2') + with self.assertWarns(UserWarning) as cw: + # colr box has bad length. + jp2 = Jp2k(jfile) + + ids = [box.id for box in jp2.box] + self.assertEqual(ids, ['jP ', 'ftyp', 'jp2h', 'jp2c']) + + ids = [box.id for box in jp2.box[2].box] + self.assertEqual(ids, ['ihdr', 'colr']) + + # Signature box. Check for corruption. + self.assertEqual(jp2.box[0].signature, (13, 10, 135, 10)) + + # File type box. + self.assertEqual(jp2.box[1].brand, 'jp2 ') + self.assertEqual(jp2.box[1].minor_version, 0) + self.assertEqual(jp2.box[1].compatibility_list[0], 'jp2 ') + + # Jp2 Header + # Image header + self.assertEqual(jp2.box[2].box[0].height, 152) + self.assertEqual(jp2.box[2].box[0].width, 203) + self.assertEqual(jp2.box[2].box[0].num_components, 3) + self.assertEqual(jp2.box[2].box[0].bits_per_component, 8) + self.assertEqual(jp2.box[2].box[0].signed, False) + self.assertEqual(jp2.box[2].box[0].compression, 7) # wavelet + self.assertEqual(jp2.box[2].box[0].cspace_unknown, False) + self.assertEqual(jp2.box[2].box[0].ip_provided, False) + + # Jp2 Header + # Colour specification + self.assertEqual(jp2.box[2].box[1].method, 1) + self.assertEqual(jp2.box[2].box[1].precedence, 0) + self.assertEqual(jp2.box[2].box[1].approximation, 0) # not allowed? + self.assertEqual(jp2.box[2].box[1].color_space, glymur.core.SRGB) + + c = jp2.box[3].main_header + + ids = [x.id for x in c.segment] + expected = ['SOC', 'SIZ', 'CME', 'COD', 'QCD', 'QCC', 'QCC'] + self.assertEqual(ids, expected) + + # SIZ: Image and tile size + # Profile: + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 203) + self.assertEqual(c.segment[1].Ysiz, 152) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (203, 152)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8, 8, 8)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 3) + + # COM: comment + # Registration + self.assertEqual(c.segment[2].Rcme, glymur.core.RCME_ISO_8859_1) + # Comment value + self.assertEqual(c.segment[2].Ccme.decode('latin-1'), + "Creator: JasPer Version 1.701.0") + + # COD: Coding style default + self.assertFalse(c.segment[3].Scod & 2) # no sop + self.assertFalse(c.segment[3].Scod & 4) # no eph + self.assertEqual(c.segment[3].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[3]._layers, 1) # layers = 1 + self.assertEqual(c.segment[3].SPcod[3], 1) # mct + self.assertEqual(c.segment[3].SPcod[4], 5) # level + self.assertEqual(tuple(c.segment[3]._code_block_size), + (64, 64)) # cblk + # Selective arithmetic coding bypass + self.assertFalse(c.segment[3].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[3].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[3].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[3].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[3].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[3].SPcod[7] & 0x0020) + self.assertEqual(c.segment[3].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[3].SPcod), 9) + + # QCD: Quantization default + self.assertEqual(c.segment[4].Sqcd & 0x1f, 0) + self.assertEqual(c.segment[4]._guardBits, 2) + self.assertEqual(c.segment[4]._mantissa, [0] * 16) + self.assertEqual(c.segment[4]._exponent, + [8] + [9, 9, 10] * 5) + + # QCC: Quantization component + # associated component + self.assertEqual(c.segment[5].Cqcc, 1) + self.assertEqual(c.segment[5]._guardBits, 2) + # quantization type + self.assertEqual(c.segment[5].Sqcc & 0x1f, 0) # none + self.assertEqual(c.segment[5]._mantissa, [0] * 16) + self.assertEqual(c.segment[5]._exponent, + [8] + [9, 9, 10] * 5) + + # QCC: Quantization component + # associated component + self.assertEqual(c.segment[6].Cqcc, 2) + self.assertEqual(c.segment[6]._guardBits, 2) + # quantization type + self.assertEqual(c.segment[6].Sqcc & 0x1f, 0) # none + self.assertEqual(c.segment[6]._mantissa, [0] * 16) + self.assertEqual(c.segment[6]._exponent, + [8] + [9, 9, 10] * 5) + + def test_NR_broken2_jp2_dump(self): + # Invalid marker ID on codestream. + jfile = os.path.join(data_root, + 'input/nonregression/broken2.jp2') + with self.assertRaises(IOError): + jp2 = Jp2k(jfile) + + @unittest.skipIf(sys.hexversion < 0x03020000, + "Uses features introduced in 3.2.") + def test_NR_broken3_jp2_dump(self): + jfile = os.path.join(data_root, + 'input/nonregression/broken3.jp2') + with self.assertWarns(UserWarning) as cw: + # colr box has bad length. + jp2 = Jp2k(jfile) + + ids = [box.id for box in jp2.box] + self.assertEqual(ids, ['jP ', 'ftyp', 'jp2h', 'jp2c']) + + ids = [box.id for box in jp2.box[2].box] + self.assertEqual(ids, ['ihdr', 'colr']) + + # Signature box. Check for corruption. + self.assertEqual(jp2.box[0].signature, (13, 10, 135, 10)) + + # File type box. + self.assertEqual(jp2.box[1].brand, 'jp2 ') + self.assertEqual(jp2.box[1].minor_version, 0) + self.assertEqual(jp2.box[1].compatibility_list[0], 'jp2 ') + + # Jp2 Header + # Image header + self.assertEqual(jp2.box[2].box[0].height, 152) + self.assertEqual(jp2.box[2].box[0].width, 203) + self.assertEqual(jp2.box[2].box[0].num_components, 3) + self.assertEqual(jp2.box[2].box[0].bits_per_component, 8) + self.assertEqual(jp2.box[2].box[0].signed, False) + self.assertEqual(jp2.box[2].box[0].compression, 7) # wavelet + self.assertEqual(jp2.box[2].box[0].cspace_unknown, False) + self.assertEqual(jp2.box[2].box[0].ip_provided, False) + + # Jp2 Header + # Colour specification + self.assertEqual(jp2.box[2].box[1].method, 1) + self.assertEqual(jp2.box[2].box[1].precedence, 0) + self.assertEqual(jp2.box[2].box[1].approximation, 0) # JP2 + self.assertEqual(jp2.box[2].box[1].color_space, glymur.core.SRGB) + + c = jp2.box[3].main_header + + ids = [x.id for x in c.segment] + expected = ['SOC', 'SIZ', 'CME', 'COD', 'QCD', 'QCC', 'QCC'] + self.assertEqual(ids, expected) + + # SIZ: Image and tile size + # Profile: + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 203) + self.assertEqual(c.segment[1].Ysiz, 152) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (203, 152)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8, 8, 8)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 3) + + # COM: comment + # Registration + self.assertEqual(c.segment[2].Rcme, glymur.core.RCME_ISO_8859_1) + # Comment value + self.assertEqual(c.segment[2].Ccme.decode('latin-1'), + "Creator: JasPer Vers)on 1.701.0") + + # COD: Coding style default + self.assertFalse(c.segment[3].Scod & 2) # no sop + self.assertFalse(c.segment[3].Scod & 4) # no eph + self.assertEqual(c.segment[3].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[3]._layers, 1) # layers = 1 + self.assertEqual(c.segment[3].SPcod[3], 1) # mct + self.assertEqual(c.segment[3].SPcod[4], 5) # level + self.assertEqual(tuple(c.segment[3]._code_block_size), + (64, 64)) # cblk + # Selective arithmetic coding bypass + self.assertFalse(c.segment[3].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[3].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[3].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[3].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[3].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[3].SPcod[7] & 0x0020) + self.assertEqual(c.segment[3].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[3].SPcod), 9) + + # QCD: Quantization default + self.assertEqual(c.segment[4].Sqcd & 0x1f, 0) + self.assertEqual(c.segment[4]._guardBits, 2) + self.assertEqual(c.segment[4]._mantissa, [0] * 16) + self.assertEqual(c.segment[4]._exponent, + [8] + [9, 9, 10] * 5) + + # QCC: Quantization component + # associated component + self.assertEqual(c.segment[5].Cqcc, 1) + self.assertEqual(c.segment[5]._guardBits, 2) + # quantization type + self.assertEqual(c.segment[5].Sqcc & 0x1f, 0) # none + self.assertEqual(c.segment[5]._mantissa, [0] * 16) + self.assertEqual(c.segment[5]._exponent, + [8] + [9, 9, 10] * 5) + + # QCC: Quantization component + # associated component + self.assertEqual(c.segment[6].Cqcc, 2) + self.assertEqual(c.segment[6]._guardBits, 2) + # quantization type + self.assertEqual(c.segment[6].Sqcc & 0x1f, 0) # none + self.assertEqual(c.segment[6]._mantissa, [0] * 16) + self.assertEqual(c.segment[6]._exponent, + [8] + [9, 9, 10] * 5) + + def test_NR_broken4_jp2_dump(self): + jfile = os.path.join(data_root, + 'input/nonregression/broken4.jp2') + with self.assertRaises(IOError): + jp2 = Jp2k(jfile) + + def test_NR_file409752(self): + jfile = os.path.join(data_root, + 'input/nonregression/file409752.jp2') + jp2 = Jp2k(jfile) + + ids = [box.id for box in jp2.box] + self.assertEqual(ids, ['jP ', 'ftyp', 'jp2h', 'jp2c']) + + ids = [box.id for box in jp2.box[2].box] + self.assertEqual(ids, ['ihdr', 'colr']) + + # Signature box. Check for corruption. + self.assertEqual(jp2.box[0].signature, (13, 10, 135, 10)) + + # File type box. + self.assertEqual(jp2.box[1].brand, 'jp2 ') + self.assertEqual(jp2.box[1].minor_version, 0) + self.assertEqual(jp2.box[1].compatibility_list[0], 'jp2 ') + + # Jp2 Header + # Image header + self.assertEqual(jp2.box[2].box[0].height, 243) + self.assertEqual(jp2.box[2].box[0].width, 720) + self.assertEqual(jp2.box[2].box[0].num_components, 3) + self.assertEqual(jp2.box[2].box[0].bits_per_component, 8) + self.assertEqual(jp2.box[2].box[0].signed, False) + self.assertEqual(jp2.box[2].box[0].compression, 7) # wavelet + self.assertEqual(jp2.box[2].box[0].cspace_unknown, False) + self.assertEqual(jp2.box[2].box[0].ip_provided, False) + + # Jp2 Header + # Colour specification + self.assertEqual(jp2.box[2].box[1].method, 1) + self.assertEqual(jp2.box[2].box[1].precedence, 0) + self.assertEqual(jp2.box[2].box[1].approximation, 0) # JP2 + self.assertEqual(jp2.box[2].box[1].color_space, glymur.core.YCC) + + c = jp2.box[3].main_header + + ids = [x.id for x in c.segment] + expected = ['SOC', 'SIZ', 'COD', 'QCD'] + self.assertEqual(ids, expected) + + # SIZ: Image and tile size + # Profile: + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 720) + self.assertEqual(c.segment[1].Ysiz, 243) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (720, 243)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8, 8, 8)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1), (2, 1), (2, 1)]) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 1) # layers = 1 + self.assertEqual(c.segment[2].SPcod[3], 0) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), + (32, 128)) # cblk + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + self.assertEqual(c.segment[3].Sqcd & 0x1f, 2) + self.assertEqual(c.segment[3]._guardBits, 1) + self.assertEqual(c.segment[3]._mantissa, + [1816, 1792, 1792, 1724, 1770, 1770, 1724, 1868, + 1868, 1892, 3, 3, 69, 2002, 2002, 1889]) + self.assertEqual(c.segment[3]._exponent, + [13] * 4 + [12] * 3 + [11] * 3 + [9] * 6) + + @unittest.skipIf(sys.hexversion < 0x03020000, + "Uses features introduced in 3.2.") + def test_NR_gdal_fuzzer_assert_in_opj_j2k_read_SQcd_SQcc_patch_jp2(self): + lst = ['input', 'nonregression', + 'gdal_fuzzer_assert_in_opj_j2k_read_SQcd_SQcc.patch.jp2'] + jfile = os.path.join(data_root, '/'.join(lst)) + with self.assertWarns(UserWarning): + jp2 = Jp2k(jfile) + + @unittest.skipIf(sys.hexversion < 0x03020000, + "Uses features introduced in 3.2.") + def test_NR_gdal_fuzzer_check_comp_dx_dy_jp2_dump(self): + lst = ['input', 'nonregression', 'gdal_fuzzer_check_comp_dx_dy.jp2'] + jfile = os.path.join(data_root, '/'.join(lst)) + with self.assertWarns(UserWarning): + jp2 = Jp2k(jfile) + + @unittest.skipIf(sys.hexversion < 0x03020000, + "Uses features introduced in 3.2.") + def test_NR_gdal_fuzzer_check_number_of_tiles(self): + # Has an impossible tiling setup. + lst = ['input', 'nonregression', + 'gdal_fuzzer_check_number_of_tiles.jp2'] + jfile = os.path.join(data_root, '/'.join(lst)) + with self.assertWarns(UserWarning): + jp2 = Jp2k(jfile) + + @unittest.skipIf(sys.hexversion < 0x03020000, + "Uses features introduced in 3.2.") + def test_NR_gdal_fuzzer_unchecked_numresolutions_dump(self): + # Has an invalid number of resolutions. + lst = ['input', 'nonregression', + 'gdal_fuzzer_unchecked_numresolutions.jp2'] + jfile = os.path.join(data_root, '/'.join(lst)) + with self.assertWarns(UserWarning): + jp2 = Jp2k(jfile) + + def test_NR_issue104_jpxstream_dump(self): + jfile = os.path.join(data_root, + 'input/nonregression/issue104_jpxstream.jp2') + jp2 = Jp2k(jfile) + + ids = [box.id for box in jp2.box] + self.assertEqual(ids, ['jP ', 'ftyp', 'rreq', 'jp2h', 'jp2c']) + + ids = [box.id for box in jp2.box[3].box] + self.assertEqual(ids, ['ihdr', 'colr', 'pclr', 'cmap']) + + # Signature box. Check for corruption. + self.assertEqual(jp2.box[0].signature, (13, 10, 135, 10)) + + # File type box. + self.assertEqual(jp2.box[1].brand, 'jp2 ') + self.assertEqual(jp2.box[1].minor_version, 0) + self.assertEqual(jp2.box[1].compatibility_list[0], 'jp2 ') + self.assertEqual(jp2.box[1].compatibility_list[1], 'jpxb') + self.assertEqual(jp2.box[1].compatibility_list[2], 'jpx ') + + # Reader requirements talk. + self.assertTrue(glymur.core.RREQ_UNRESTRICTED_JPEG2000_PART_1 + in jp2.box[2].standard_flag) + + # Jp2 Header + # Image header + self.assertEqual(jp2.box[3].box[0].height, 203) + self.assertEqual(jp2.box[3].box[0].width, 479) + self.assertEqual(jp2.box[3].box[0].num_components, 1) + self.assertEqual(jp2.box[3].box[0].bits_per_component, 8) + self.assertEqual(jp2.box[3].box[0].signed, False) + self.assertEqual(jp2.box[3].box[0].compression, 7) # wavelet + self.assertEqual(jp2.box[3].box[0].cspace_unknown, True) + self.assertEqual(jp2.box[3].box[0].ip_provided, False) + + # Jp2 Header + # Colour specification + self.assertEqual(jp2.box[3].box[1].method, 1) # enumerated + self.assertEqual(jp2.box[3].box[1].precedence, 2) + self.assertEqual(jp2.box[3].box[1].approximation, 1) # exact + self.assertEqual(jp2.box[3].box[1].color_space, glymur.core.SRGB) + + # Jp2 Header + # Palette box. + self.assertEqual(len(jp2.box[3].box[2].palette), 3) + self.assertEqual(len(jp2.box[3].box[2].palette[0]), 256) + self.assertEqual(len(jp2.box[3].box[2].palette[1]), 256) + self.assertEqual(len(jp2.box[3].box[2].palette[2]), 256) + + # Jp2 Header + # Component mapping box + self.assertEqual(jp2.box[3].box[3].component_index, (0, 0, 0)) + self.assertEqual(jp2.box[3].box[3].mapping_type, (1, 1, 1)) + self.assertEqual(jp2.box[3].box[3].palette_index, (0, 1, 2)) + + c = jp2.box[4].main_header + + ids = [x.id for x in c.segment] + expected = ['SOC', 'SIZ', 'COD', 'QCD'] + self.assertEqual(ids, expected) + + # SIZ: Image and tile size + # Profile: + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 479) + self.assertEqual(c.segment[1].Ysiz, 203) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (256, 203)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8,)) + # signed + self.assertEqual(c.segment[1]._signed, (False,)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)]) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.RLCP) + self.assertEqual(c.segment[2]._layers, 1) # layers = 1 + self.assertEqual(c.segment[2].SPcod[3], 0) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), + (32, 32)) # cblk + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + self.assertEqual(c.segment[3].Sqcd & 0x1f, 0) + self.assertEqual(c.segment[3]._guardBits, 2) + self.assertEqual(c.segment[3]._mantissa, [0] * 16) + self.assertEqual(c.segment[3]._exponent, [8] + [9, 9, 10] * 5) + + def test_NR_issue188_beach_64bitsbox(self): + lst = ['input', 'nonregression', 'issue188_beach_64bitsbox.jp2'] + jfile = os.path.join(data_root, '/'.join(lst)) + with warnings.catch_warnings(): + # There's a warning for an unknown box. We explicitly test for + # that down below. + warnings.simplefilter("ignore") + jp2 = Jp2k(jfile) + + ids = [box.id for box in jp2.box] + self.assertEqual(ids, ['jP ', 'ftyp', 'jp2h', 'XML ', 'jp2c']) + + ids = [box.id for box in jp2.box[2].box] + self.assertEqual(ids, ['ihdr', 'colr']) + + # Signature box. Check for corruption. + self.assertEqual(jp2.box[0].signature, (13, 10, 135, 10)) + + # File type box. + self.assertEqual(jp2.box[1].brand, 'jp2 ') + self.assertEqual(jp2.box[1].minor_version, 0) + self.assertEqual(jp2.box[1].compatibility_list[0], 'jp2 ') + + # Jp2 Header + # Image header + self.assertEqual(jp2.box[2].box[0].height, 200) + self.assertEqual(jp2.box[2].box[0].width, 200) + self.assertEqual(jp2.box[2].box[0].num_components, 3) + self.assertEqual(jp2.box[2].box[0].bits_per_component, 8) + self.assertEqual(jp2.box[2].box[0].signed, False) + self.assertEqual(jp2.box[2].box[0].compression, 7) # wavelet + self.assertEqual(jp2.box[2].box[0].cspace_unknown, True) + self.assertEqual(jp2.box[2].box[0].ip_provided, False) + + # Jp2 Header + # Colour specification + self.assertEqual(jp2.box[2].box[1].method, 1) + self.assertEqual(jp2.box[2].box[1].precedence, 0) + self.assertEqual(jp2.box[2].box[1].approximation, 0) + self.assertEqual(jp2.box[2].box[1].color_space, glymur.core.SRGB) + + # Skip the 4th box, it is uknown. + + c = jp2.box[4].main_header + + ids = [x.id for x in c.segment] + expected = ['SOC', 'SIZ', 'COD', 'QCD', 'CME', 'CME'] + self.assertEqual(ids, expected) + + # SIZ: Image and tile size + # Profile: + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 200) + self.assertEqual(c.segment[1].Ysiz, 200) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (200, 200)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8, 8, 8)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 3) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 1) # layers = 1 + self.assertEqual(c.segment[2].SPcod[3], 1) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), + (64, 64)) # cblk + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + self.assertEqual(c.segment[3].Sqcd & 0x1f, 2) + self.assertEqual(c.segment[3]._guardBits, 1) + + def test_NR_issue206_image_000_dump(self): + jfile = os.path.join(data_root, + 'input/nonregression/issue206_image-000.jp2') + jp2 = Jp2k(jfile) + + ids = [box.id for box in jp2.box] + self.assertEqual(ids, ['jP ', 'ftyp', 'rreq', 'jp2h', 'jp2c']) + + ids = [box.id for box in jp2.box[3].box] + self.assertEqual(ids, ['ihdr', 'colr']) + + # Signature box. Check for corruption. + self.assertEqual(jp2.box[0].signature, (13, 10, 135, 10)) + + # File type box. + self.assertEqual(jp2.box[1].brand, 'jp2 ') + self.assertEqual(jp2.box[1].minor_version, 0) + self.assertEqual(jp2.box[1].compatibility_list[0], 'jp2 ') + self.assertEqual(jp2.box[1].compatibility_list[1], 'jpxb') + self.assertEqual(jp2.box[1].compatibility_list[2], 'jpx ') + + # Reader requirements talk. + self.assertTrue(glymur.core.RREQ_UNRESTRICTED_JPEG2000_PART_1 + in jp2.box[2].standard_flag) + + # Jp2 Header + # Image header + self.assertEqual(jp2.box[3].box[0].height, 326) + self.assertEqual(jp2.box[3].box[0].width, 431) + self.assertEqual(jp2.box[3].box[0].num_components, 3) + self.assertEqual(jp2.box[3].box[0].bits_per_component, 8) + self.assertEqual(jp2.box[3].box[0].signed, False) + self.assertEqual(jp2.box[3].box[0].compression, 7) # wavelet + self.assertEqual(jp2.box[3].box[0].cspace_unknown, True) + self.assertEqual(jp2.box[3].box[0].ip_provided, False) + + # Jp2 Header + # Colour specification + self.assertEqual(jp2.box[3].box[1].method, 1) # ICC + self.assertEqual(jp2.box[3].box[1].precedence, 2) + self.assertEqual(jp2.box[3].box[1].approximation, 1) # JPX exact + self.assertEqual(jp2.box[3].box[1].color_space, glymur.core.SRGB) + + c = jp2.box[4].main_header + + ids = [x.id for x in c.segment] + expected = ['SOC', 'SIZ', 'COD', 'QCD'] + self.assertEqual(ids, expected) + + # SIZ: Image and tile size + # Profile: + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 431) + self.assertEqual(c.segment[1].Ysiz, 326) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (256, 256)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8, 8, 8)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 3) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.RLCP) + self.assertEqual(c.segment[2]._layers, 1) # layers = 1 + self.assertEqual(c.segment[2].SPcod[3], 1) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), + (32, 32)) # cblk + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + self.assertEqual(c.segment[3].Sqcd & 0x1f, 2) + self.assertEqual(c.segment[3]._guardBits, 2) + self.assertEqual(c.segment[3]._mantissa, [0] * 16) + self.assertEqual(c.segment[3]._exponent, [8] + [9, 9, 10] * 5) + + def test_NR_Marrin_jp2_dump(self): + jfile = os.path.join(data_root, + 'input/nonregression/Marrin.jp2') + jp2 = Jp2k(jfile) + + ids = [box.id for box in jp2.box] + self.assertEqual(ids, ['jP ', 'ftyp', 'jp2h', 'jp2c']) + + ids = [box.id for box in jp2.box[2].box] + self.assertEqual(ids, ['ihdr', 'colr', 'cdef', 'res ']) + + ids = [box.id for box in jp2.box[2].box[3].box] + self.assertEqual(ids, ['resd']) + + # Signature box. Check for corruption. + self.assertEqual(jp2.box[0].signature, (13, 10, 135, 10)) + + # File type box. + self.assertEqual(jp2.box[1].brand, 'jp2 ') + self.assertEqual(jp2.box[1].minor_version, 0) + self.assertEqual(jp2.box[1].compatibility_list[0], 'jp2 ') + + # Jp2 Header + # Image header + self.assertEqual(jp2.box[2].box[0].height, 135) + self.assertEqual(jp2.box[2].box[0].width, 135) + self.assertEqual(jp2.box[2].box[0].num_components, 2) + self.assertEqual(jp2.box[2].box[0].bits_per_component, 8) + self.assertEqual(jp2.box[2].box[0].signed, False) + self.assertEqual(jp2.box[2].box[0].compression, 7) # wavelet + self.assertEqual(jp2.box[2].box[0].cspace_unknown, True) + self.assertEqual(jp2.box[2].box[0].ip_provided, False) + + # Jp2 Header + # Colour specification + self.assertEqual(jp2.box[2].box[1].method, 1) + self.assertEqual(jp2.box[2].box[1].precedence, 0) + self.assertEqual(jp2.box[2].box[1].approximation, 0) # JP2 + self.assertEqual(jp2.box[2].box[1].color_space, glymur.core.GREYSCALE) + + # Jp2 Header + # Channel Definition + self.assertEqual(jp2.box[2].box[2].component_number, (0, 1)) + self.assertEqual(jp2.box[2].box[2].component_type, (0, 1)) # opacity + self.assertEqual(jp2.box[2].box[2].association, (0, 0)) # both main + + c = jp2.box[3].main_header + + ids = [x.id for x in c.segment] + expected = ['SOC', 'SIZ', 'COD', 'QCD', 'CME'] + self.assertEqual(ids, expected) + + # SIZ: Image and tile size + # Profile: + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 135) + self.assertEqual(c.segment[1].Ysiz, 135) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (135, 135)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8, 8)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 2) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 2) # layers = 2 + self.assertEqual(c.segment[2].SPcod[3], 0) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), + (64, 64)) # cblk + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_9x7_IRREVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + self.assertEqual(c.segment[3].Sqcd & 0x1f, 2) + self.assertEqual(c.segment[3]._guardBits, 1) + self.assertEqual(c.segment[3]._mantissa, + [1822, 1770, 1770, 1724, 1792, 1792, 1762, 1868, 1868, + 1892, 3, 3, 69, 2002, 2002, 1889]) + self.assertEqual(c.segment[3]._exponent, + [14] * 4 + [13] * 3 + [12] * 3 + [10] * 6) + + # COM: comment + # Registration + self.assertEqual(c.segment[4].Rcme, glymur.core.RCME_ISO_8859_1) + # Comment value + self.assertEqual(c.segment[4].Ccme.decode('latin-1'), + "Kakadu-v5.2.1") + + def test_NR_mem_b2ace68c_1381_dump(self): + jfile = os.path.join(data_root, + 'input/nonregression/mem-b2ace68c-1381.jp2') + with warnings.catch_warnings(): + # This file has a bad pclr box, we test for this elsewhere. + warnings.simplefilter("ignore") + jp2 = Jp2k(jfile) + + ids = [box.id for box in jp2.box] + self.assertEqual(ids, ['jP ', 'ftyp', 'rreq', 'jp2h', 'jp2c']) + + ids = [box.id for box in jp2.box[3].box] + self.assertEqual(ids, ['ihdr', 'colr', 'pclr', 'cmap']) + + # Signature box. Check for corruption. + self.assertEqual(jp2.box[0].signature, (13, 10, 135, 10)) + + # File type box. + self.assertEqual(jp2.box[1].brand, 'jp2 ') + self.assertEqual(jp2.box[1].minor_version, 0) + self.assertEqual(jp2.box[1].compatibility_list[0], 'jp2 ') + self.assertEqual(jp2.box[1].compatibility_list[1], 'jpxb') + self.assertEqual(jp2.box[1].compatibility_list[2], 'jpx ') + + # Reader requirements talk. + self.assertTrue(glymur.core.RREQ_CMYK_ENUMERATED_COLORSPACE + in jp2.box[2].standard_flag) + + # Jp2 Header + # Image header + self.assertEqual(jp2.box[3].box[0].height, 865) + self.assertEqual(jp2.box[3].box[0].width, 649) + self.assertEqual(jp2.box[3].box[0].num_components, 1) + self.assertEqual(jp2.box[3].box[0].bits_per_component, 1) + self.assertEqual(jp2.box[3].box[0].signed, False) + self.assertEqual(jp2.box[3].box[0].compression, 7) # wavelet + self.assertEqual(jp2.box[3].box[0].cspace_unknown, True) + self.assertEqual(jp2.box[3].box[0].ip_provided, False) + + # Jp2 Header + # Colour specification + self.assertEqual(jp2.box[3].box[1].method, 1) # enumerated + self.assertEqual(jp2.box[3].box[1].precedence, 2) + self.assertEqual(jp2.box[3].box[1].approximation, 1) # JPX exact + self.assertEqual(jp2.box[3].box[1].color_space, glymur.core.CMYK) + + # Jp2 Header + # Palette box. + self.assertEqual(len(jp2.box[3].box[2].palette), 4) + self.assertEqual(len(jp2.box[3].box[2].palette[0]), 1) + self.assertEqual(len(jp2.box[3].box[2].palette[1]), 1) + self.assertEqual(len(jp2.box[3].box[2].palette[2]), 1) + self.assertEqual(len(jp2.box[3].box[2].palette[3]), 1) + + # Jp2 Header + # Component mapping box + self.assertEqual(jp2.box[3].box[3].component_index, (0, 1, 2)) + self.assertEqual(jp2.box[3].box[3].mapping_type, (1, 1, 0)) + self.assertEqual(jp2.box[3].box[3].palette_index, (0, 0, 1)) + + c = jp2.box[4].main_header + + ids = [x.id for x in c.segment] + expected = ['SOC', 'SIZ', 'COD', 'QCD'] + self.assertEqual(ids, expected) + + # SIZ: Image and tile size + # Profile: + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 649) + self.assertEqual(c.segment[1].Ysiz, 865) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (256, 256)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (1,)) + # signed + self.assertEqual(c.segment[1]._signed, (False,)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)]) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.RLCP) + self.assertEqual(c.segment[2]._layers, 1) # layers = 1 + self.assertEqual(c.segment[2].SPcod[3], 0) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), + (32, 32)) # cblk + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + self.assertEqual(c.segment[3].Sqcd & 0x1f, 0) + self.assertEqual(c.segment[3]._guardBits, 3) + self.assertEqual(c.segment[3]._mantissa, [0] * 16) + self.assertEqual(c.segment[3]._exponent, [1] + [2, 2, 3] * 5) + + def test_NR_mem_b2b86b74_2753_dump(self): + jfile = os.path.join(data_root, + 'input/nonregression/mem-b2b86b74-2753.jp2') + jp2 = Jp2k(jfile) + + ids = [box.id for box in jp2.box] + self.assertEqual(ids, ['jP ', 'ftyp', 'rreq', 'jp2h', 'jp2c']) + + ids = [box.id for box in jp2.box[3].box] + self.assertEqual(ids, ['ihdr', 'colr', 'pclr', 'cmap']) + + # Signature box. Check for corruption. + self.assertEqual(jp2.box[0].signature, (13, 10, 135, 10)) + + # File type box. + self.assertEqual(jp2.box[1].brand, 'jp2 ') + self.assertEqual(jp2.box[1].minor_version, 0) + self.assertEqual(jp2.box[1].compatibility_list[0], 'jp2 ') + self.assertEqual(jp2.box[1].compatibility_list[1], 'jpxb') + self.assertEqual(jp2.box[1].compatibility_list[2], 'jpx ') + + # Reader requirements talk. + self.assertTrue(glymur.core.RREQ_UNRESTRICTED_JPEG2000_PART_1 + in jp2.box[2].standard_flag) + + # Jp2 Header + # Image header + self.assertEqual(jp2.box[3].box[0].height, 46) + self.assertEqual(jp2.box[3].box[0].width, 124) + self.assertEqual(jp2.box[3].box[0].num_components, 1) + self.assertEqual(jp2.box[3].box[0].bits_per_component, 4) + self.assertEqual(jp2.box[3].box[0].signed, False) + self.assertEqual(jp2.box[3].box[0].compression, 7) # wavelet + self.assertEqual(jp2.box[3].box[0].cspace_unknown, True) + self.assertEqual(jp2.box[3].box[0].ip_provided, False) + + # Jp2 Header + # Colour specification + self.assertEqual(jp2.box[3].box[1].method, 1) # enumerated + self.assertEqual(jp2.box[3].box[1].precedence, 2) + self.assertEqual(jp2.box[3].box[1].approximation, 1) # JPX exact + self.assertEqual(jp2.box[3].box[1].color_space, glymur.core.SRGB) + + # Jp2 Header + # Palette box. + # 3 columns with 16 entries. + self.assertEqual(len(jp2.box[3].box[2].palette), 3) + self.assertEqual(len(jp2.box[3].box[2].palette[0]), 16) + self.assertEqual(len(jp2.box[3].box[2].palette[1]), 16) + self.assertEqual(len(jp2.box[3].box[2].palette[2]), 16) + + # Jp2 Header + # Component mapping box + self.assertEqual(jp2.box[3].box[3].component_index, (0, 0, 0)) + self.assertEqual(jp2.box[3].box[3].mapping_type, (1, 1, 1)) + self.assertEqual(jp2.box[3].box[3].palette_index, (0, 1, 2)) + + c = jp2.box[4].main_header + + ids = [x.id for x in c.segment] + expected = ['SOC', 'SIZ', 'COD', 'QCD'] + self.assertEqual(ids, expected) + + # SIZ: Image and tile size + # Profile: + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 124) + self.assertEqual(c.segment[1].Ysiz, 46) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (124, 46)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (4,)) + # signed + self.assertEqual(c.segment[1]._signed, (False,)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)]) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.RLCP) + self.assertEqual(c.segment[2]._layers, 1) # layers = 1 + self.assertEqual(c.segment[2].SPcod[3], 0) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), + (32, 32)) # cblk + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + self.assertEqual(c.segment[3].Sqcd & 0x1f, 0) + self.assertEqual(c.segment[3]._guardBits, 2) + self.assertEqual(c.segment[3]._mantissa, [0] * 16) + self.assertEqual(c.segment[3]._exponent, [4] + [5, 5, 6] * 5) + + def test_NR_merged_dump(self): + jfile = os.path.join(data_root, + 'input/nonregression/merged.jp2') + jp2 = Jp2k(jfile) + + ids = [box.id for box in jp2.box] + self.assertEqual(ids, ['jP ', 'ftyp', 'jp2h', 'jp2c']) + + ids = [box.id for box in jp2.box[2].box] + self.assertEqual(ids, ['ihdr', 'colr']) + + # Signature box. Check for corruption. + self.assertEqual(jp2.box[0].signature, (13, 10, 135, 10)) + + # File type box. + self.assertEqual(jp2.box[1].brand, 'jp2 ') + self.assertEqual(jp2.box[1].minor_version, 0) + self.assertEqual(jp2.box[1].compatibility_list[0], 'jp2 ') + + # Jp2 Header + # Image header + self.assertEqual(jp2.box[2].box[0].height, 576) + self.assertEqual(jp2.box[2].box[0].width, 766) + self.assertEqual(jp2.box[2].box[0].num_components, 3) + self.assertEqual(jp2.box[2].box[0].bits_per_component, 8) + self.assertEqual(jp2.box[2].box[0].signed, False) + self.assertEqual(jp2.box[2].box[0].compression, 7) # wavelet + self.assertEqual(jp2.box[2].box[0].cspace_unknown, False) + self.assertEqual(jp2.box[2].box[0].ip_provided, False) + + # Jp2 Header + # Colour specification + self.assertEqual(jp2.box[2].box[1].method, 1) + self.assertEqual(jp2.box[2].box[1].precedence, 0) + self.assertEqual(jp2.box[2].box[1].approximation, 0) # JP2 + self.assertEqual(jp2.box[2].box[1].color_space, glymur.core.YCC) + + c = jp2.box[3].main_header + + ids = [x.id for x in c.segment] + expected = ['SOC', 'SIZ', 'COD', 'QCD', 'POD'] + self.assertEqual(ids, expected) + + # SIZ: Image and tile size + # Profile: + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 766) + self.assertEqual(c.segment[1].Ysiz, 576) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (766, 576)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8, 8, 8)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1), (2, 1), (2, 1)]) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 1) # layers = 1 + self.assertEqual(c.segment[2].SPcod[3], 0) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), + (32, 128)) # cblk + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + self.assertEqual(c.segment[3].Sqcd & 0x1f, 0) + self.assertEqual(c.segment[3]._guardBits, 1) + self.assertEqual(c.segment[3]._mantissa, [0] * 16) + self.assertEqual(c.segment[3]._exponent, [8] + [9, 9, 10] * 5) + + # POD: progression order change + self.assertEqual(c.segment[4].RSpod, (0, 0)) + self.assertEqual(c.segment[4].CSpod, (0, 1)) + self.assertEqual(c.segment[4].LYEpod, (1, 1)) + self.assertEqual(c.segment[4].REpod, (6, 6)) + self.assertEqual(c.segment[4].CEpod, (1, 3)) + + podvals = (glymur.core.LRCP, glymur.core.LRCP) + self.assertEqual(c.segment[4].Ppod, podvals) + + def test_NR_orb_blue10_lin_jp2_dump(self): + jfile = os.path.join(data_root, + 'input/nonregression/orb-blue10-lin-jp2.jp2') + jp2 = Jp2k(jfile) + + ids = [box.id for box in jp2.box] + self.assertEqual(ids, ['jP ', 'ftyp', 'jp2h', 'jp2c']) + + ids = [box.id for box in jp2.box[2].box] + self.assertEqual(ids, ['ihdr', 'colr']) + + # Signature box. Check for corruption. + self.assertEqual(jp2.box[0].signature, (13, 10, 135, 10)) + + # File type box. + self.assertEqual(jp2.box[1].brand, 'jp2 ') + self.assertEqual(jp2.box[1].minor_version, 0) + self.assertEqual(jp2.box[1].compatibility_list[0], 'jp2 ') + + # Jp2 Header + # Image header + self.assertEqual(jp2.box[2].box[0].height, 117) + self.assertEqual(jp2.box[2].box[0].width, 117) + self.assertEqual(jp2.box[2].box[0].num_components, 4) + self.assertEqual(jp2.box[2].box[0].bits_per_component, 8) + self.assertEqual(jp2.box[2].box[0].signed, False) + self.assertEqual(jp2.box[2].box[0].compression, 7) # wavelet + self.assertEqual(jp2.box[2].box[0].cspace_unknown, False) + self.assertEqual(jp2.box[2].box[0].ip_provided, False) + + # Jp2 Header + # Colour specification + self.assertEqual(jp2.box[2].box[1].method, 2) # res icc + self.assertEqual(jp2.box[2].box[1].precedence, 0) + self.assertEqual(jp2.box[2].box[1].approximation, 0) # JP2 + self.assertEqual(len(jp2.box[2].box[1].icc_profile), 1) + self.assertIsNone(jp2.box[2].box[1].color_space) + + c = jp2.box[3].main_header + + ids = [x.id for x in c.segment] + expected = ['SOC', 'SIZ', 'COD', 'QCD'] + self.assertEqual(ids, expected) + + # SIZ: Image and tile size + # Profile: + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 117) + self.assertEqual(c.segment[1].Ysiz, 117) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (117, 117)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8, 8, 8, 8)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False, False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 4) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 1) # layers = 1 + self.assertEqual(c.segment[2].SPcod[3], 0) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), + (64, 64)) # cblk + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + self.assertEqual(c.segment[3].Sqcd & 0x1f, 0) + self.assertEqual(c.segment[3]._guardBits, 2) + self.assertEqual(c.segment[3]._mantissa, [0] * 16) + self.assertEqual(c.segment[3]._exponent, + [8, 9, 9, 10, 9, 9, 10, 9, 9, 10, 9, 9, 10, 9, 9, 10]) + + def test_NR_orb_blue10_win_jp2_dump(self): + jfile = os.path.join(data_root, + 'input/nonregression/orb-blue10-win-jp2.jp2') + jp2 = Jp2k(jfile) + + ids = [box.id for box in jp2.box] + self.assertEqual(ids, ['jP ', 'ftyp', 'jp2h', 'jp2c']) + + ids = [box.id for box in jp2.box[2].box] + self.assertEqual(ids, ['ihdr', 'colr']) + + # Signature box. Check for corruption. + self.assertEqual(jp2.box[0].signature, (13, 10, 135, 10)) + + # File type box. + self.assertEqual(jp2.box[1].brand, 'jp2 ') + self.assertEqual(jp2.box[1].minor_version, 0) + self.assertEqual(jp2.box[1].compatibility_list[0], 'jp2 ') + + # Jp2 Header + # Image header + self.assertEqual(jp2.box[2].box[0].height, 117) + self.assertEqual(jp2.box[2].box[0].width, 117) + self.assertEqual(jp2.box[2].box[0].num_components, 4) + self.assertEqual(jp2.box[2].box[0].bits_per_component, 8) + self.assertEqual(jp2.box[2].box[0].signed, False) + self.assertEqual(jp2.box[2].box[0].compression, 7) # wavelet + self.assertEqual(jp2.box[2].box[0].cspace_unknown, False) + self.assertEqual(jp2.box[2].box[0].ip_provided, False) + + # Jp2 Header + # Colour specification + self.assertEqual(jp2.box[2].box[1].method, 2) # restricted icc + self.assertEqual(jp2.box[2].box[1].precedence, 0) + self.assertEqual(jp2.box[2].box[1].approximation, 0) # JP2 + self.assertEqual(len(jp2.box[2].box[1].icc_profile), 1) + self.assertIsNone(jp2.box[2].box[1].color_space) + + c = jp2.box[3].main_header + + ids = [x.id for x in c.segment] + expected = ['SOC', 'SIZ', 'COD', 'QCD'] + self.assertEqual(ids, expected) + + # SIZ: Image and tile size + # Profile: + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 117) + self.assertEqual(c.segment[1].Ysiz, 117) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (117, 117)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8, 8, 8, 8)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False, False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 4) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 1) # layers = 1 + self.assertEqual(c.segment[2].SPcod[3], 0) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), + (64, 64)) # cblk + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + self.assertEqual(c.segment[3].Sqcd & 0x1f, 0) + self.assertEqual(c.segment[3]._guardBits, 2) + self.assertEqual(c.segment[3]._mantissa, [0] * 16) + self.assertEqual(c.segment[3]._exponent, + [8, 9, 9, 10, 9, 9, 10, 9, 9, 10, 9, 9, 10, 9, 9, 10]) + + def test_NR_text_GBR_dump(self): + jfile = os.path.join(data_root, + 'input/nonregression/text_GBR.jp2') + jp2 = Jp2k(jfile) + + ids = [box.id for box in jp2.box] + lst = ['jP ', 'ftyp', 'rreq', 'jp2h', + 'uuid', 'uuid', 'uuid', 'uuid', 'jp2c'] + self.assertEqual(ids, lst) + + ids = [box.id for box in jp2.box[3].box] + self.assertEqual(ids, ['ihdr', 'colr', 'res ']) + + # Signature box. Check for corruption. + self.assertEqual(jp2.box[0].signature, (13, 10, 135, 10)) + + # File type box. + self.assertEqual(jp2.box[1].brand, 'jp2 ') + self.assertEqual(jp2.box[1].minor_version, 0) + self.assertEqual(jp2.box[1].compatibility_list[0], 'jp2 ') + + # Reader requirements. + # Compositing layer uses any icc profile + self.assertTrue(44 in jp2.box[2].standard_flag) + + # Jp2 Header + # Image header + self.assertEqual(jp2.box[3].box[0].height, 400) + self.assertEqual(jp2.box[3].box[0].width, 400) + self.assertEqual(jp2.box[3].box[0].num_components, 3) + self.assertEqual(jp2.box[3].box[0].bits_per_component, 8) + self.assertEqual(jp2.box[3].box[0].signed, False) + self.assertEqual(jp2.box[3].box[0].compression, 7) # wavelet + self.assertEqual(jp2.box[3].box[0].cspace_unknown, True) + self.assertEqual(jp2.box[3].box[0].ip_provided, False) + + # Jp2 Header + # Colour specification + self.assertEqual(jp2.box[3].box[1].method, 3) # any icc + self.assertEqual(jp2.box[3].box[1].precedence, 2) + self.assertEqual(jp2.box[3].box[1].approximation, 1) # JPX exact + self.assertEqual(len(jp2.box[3].box[1].icc_profile), 1328) + self.assertIsNone(jp2.box[3].box[1].color_space) + + # UUID boxes. All mentioned in the RREQ box. + self.assertEqual(jp2.box[2].vendor_feature[0], jp2.box[4].uuid) + self.assertEqual(jp2.box[2].vendor_feature[1], jp2.box[5].uuid) + self.assertEqual(jp2.box[2].vendor_feature[2], jp2.box[6].uuid) + self.assertEqual(jp2.box[2].vendor_feature[3], jp2.box[7].uuid) + + c = jp2.box[8].main_header + + ids = [x.id for x in c.segment] + expected = ['SOC', 'SIZ', 'COD', 'QCD'] + self.assertEqual(ids, expected) + + # SIZ: Image and tile size + # Profile: + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual(c.segment[1].Xsiz, 400) + self.assertEqual(c.segment[1].Ysiz, 400) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), (128, 128)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8, 8, 8)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 3) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.RLCP) + self.assertEqual(c.segment[2]._layers, 6) # layers = 6 + self.assertEqual(c.segment[2].SPcod[3], 1) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # level + self.assertEqual(tuple(c.segment[2]._code_block_size), + (32, 32)) # cblk + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # QCD: Quantization default + self.assertEqual(c.segment[3].Sqcd & 0x1f, 0) + self.assertEqual(c.segment[3]._guardBits, 2) + self.assertEqual(c.segment[3]._mantissa, [0] * 16) + self.assertEqual(c.segment[3]._exponent, + [8, 9, 9, 10, 9, 9, 10, 9, 9, 10, 9, 9, 10, 9, 9, 10]) + + def test_NR_DEC_Bretagne2_j2k_1_decode(self): + jfile = os.path.join(data_root, + 'input/nonregression/Bretagne2.j2k') + jp2 = Jp2k(jfile) + data = jp2.read() + self.assertTrue(True) + + def test_NR_DEC__00042_j2k_2_decode(self): + jfile = os.path.join(data_root, + 'input/nonregression/_00042.j2k') + jp2 = Jp2k(jfile) + data = jp2.read() + self.assertTrue(True) + + def test_NR_DEC_123_j2c_3_decode(self): + jfile = os.path.join(data_root, + 'input/nonregression/123.j2c') + jp2 = Jp2k(jfile) + data = jp2.read() + self.assertTrue(True) + + @unittest.skipIf(sys.hexversion < 0x03020000, + "Uses features introduced in 3.2.") + def test_NR_DEC_broken_jp2_4_decode(self): + jfile = os.path.join(data_root, + 'input/nonregression/broken.jp2') + with self.assertWarns(UserWarning) as cw: + # colr box has bad length. + jp2 = Jp2k(jfile) + with self.assertRaises(IOError): + data = jp2.read() + self.assertTrue(True) + + def test_NR_DEC_broken2_jp2_5_decode(self): + jfile = os.path.join(data_root, + 'input/nonregression/broken2.jp2') + with self.assertRaises(IOError): + data = Jp2k(jfile).read() + self.assertTrue(True) + + @unittest.skipIf(sys.hexversion < 0x03020000, + "Uses features introduced in 3.2.") + def test_NR_DEC_broken3_jp2_6_decode(self): + jfile = os.path.join(data_root, + 'input/nonregression/broken3.jp2') + with self.assertWarns(UserWarning) as cw: + # colr box has bad length. + j = Jp2k(jfile) + + with self.assertRaises(IOError) as ce: + d = j.read() + + def test_NR_DEC_broken4_jp2_7_decode(self): + jfile = os.path.join(data_root, + 'input/nonregression/broken4.jp2') + with self.assertRaises(IOError): + data = Jp2k(jfile).read() + self.assertTrue(True) + + def test_NR_DEC_bug_j2c_8_decode(self): + jfile = os.path.join(data_root, + 'input/nonregression/bug.j2c') + data = Jp2k(jfile).read() + self.assertTrue(True) + + def test_NR_DEC_buxI_j2k_9_decode(self): + jfile = os.path.join(data_root, + 'input/nonregression/buxI.j2k') + data = Jp2k(jfile).read() + self.assertTrue(True) + + def test_NR_DEC_buxR_j2k_10_decode(self): + jfile = os.path.join(data_root, + 'input/nonregression/buxR.j2k') + data = Jp2k(jfile).read() + self.assertTrue(True) + + def test_NR_DEC_Cannotreaddatawithnosizeknown_j2k_11_decode(self): + relpath = 'input/nonregression/Cannotreaddatawithnosizeknown.j2k' + jfile = os.path.join(data_root, relpath) + data = Jp2k(jfile).read() + self.assertTrue(True) + + def test_NR_DEC_cthead1_j2k_12_decode(self): + jfile = os.path.join(data_root, + 'input/nonregression/cthead1.j2k') + data = Jp2k(jfile).read() + self.assertTrue(True) + + def test_NR_DEC_CT_Phillips_JPEG2K_Decompr_Problem_j2k_13_decode(self): + relpath = 'input/nonregression/CT_Phillips_JPEG2K_Decompr_Problem.j2k' + jfile = os.path.join(data_root, relpath) + data = Jp2k(jfile).read() + self.assertTrue(True) + + def test_NR_DEC_illegalcolortransform_j2k_14_decode(self): + # Stream too short, expected SOT. + jfile = os.path.join(data_root, + 'input/nonregression/illegalcolortransform.j2k') + data = Jp2k(jfile).read() + self.assertTrue(True) + + def test_NR_DEC_j2k32_j2k_15_decode(self): + jfile = os.path.join(data_root, + 'input/nonregression/j2k32.j2k') + data = Jp2k(jfile).read() + self.assertTrue(True) + + def test_NR_DEC_kakadu_v4_4_openjpegv2_broken_j2k_16_decode(self): + relpath = 'input/nonregression/kakadu_v4-4_openjpegv2_broken.j2k' + jfile = os.path.join(data_root, relpath) + data = Jp2k(jfile).read() + self.assertTrue(True) + + def test_NR_DEC_MarkerIsNotCompliant_j2k_17_decode(self): + jfile = os.path.join(data_root, + 'input/nonregression/MarkerIsNotCompliant.j2k') + data = Jp2k(jfile).read() + self.assertTrue(True) + + def test_NR_DEC_Marrin_jp2_18_decode(self): + jfile = os.path.join(data_root, + 'input/nonregression/Marrin.jp2') + data = Jp2k(jfile).read() + self.assertTrue(True) + + def test_NR_DEC_merged_jp2_19_decode(self): + jfile = os.path.join(data_root, + 'input/nonregression/merged.jp2') + data = Jp2k(jfile).read_bands() + self.assertTrue(True) + + def test_NR_DEC_movie_00000_j2k_20_decode(self): + jfile = os.path.join(data_root, + 'input/nonregression/movie_00000.j2k') + data = Jp2k(jfile).read() + self.assertTrue(True) + + def test_NR_DEC_movie_00001_j2k_21_decode(self): + jfile = os.path.join(data_root, + 'input/nonregression/movie_00001.j2k') + data = Jp2k(jfile).read() + self.assertTrue(True) + + def test_NR_DEC_movie_00002_j2k_22_decode(self): + jfile = os.path.join(data_root, + 'input/nonregression/movie_00002.j2k') + data = Jp2k(jfile).read() + self.assertTrue(True) + + def test_NR_DEC_orb_blue_lin_j2k_j2k_23_decode(self): + jfile = os.path.join(data_root, + 'input/nonregression/orb-blue10-lin-j2k.j2k') + data = Jp2k(jfile).read() + self.assertTrue(True) + + def test_NR_DEC_orb_blue_win_j2k_j2k_24_decode(self): + jfile = os.path.join(data_root, + 'input/nonregression/orb-blue10-win-j2k.j2k') + data = Jp2k(jfile).read() + self.assertTrue(True) + + def test_NR_DEC_orb_blue_lin_jp2_25_decode(self): + jfile = os.path.join(data_root, + 'input/nonregression/orb-blue10-lin-jp2.jp2') + data = Jp2k(jfile).read() + self.assertTrue(True) + + def test_NR_DEC_orb_blue_win_jp2_26_decode(self): + jfile = os.path.join(data_root, + 'input/nonregression/orb-blue10-win-jp2.jp2') + data = Jp2k(jfile).read() + self.assertTrue(True) + + def test_NR_DEC_relax_jp2_27_decode(self): + jfile = os.path.join(data_root, + 'input/nonregression/relax.jp2') + data = Jp2k(jfile).read() + self.assertTrue(True) + + def test_NR_DEC_test_lossless_j2k_28_decode(self): + jfile = os.path.join(data_root, + 'input/nonregression/test_lossless.j2k') + data = Jp2k(jfile).read() + self.assertTrue(True) + + def test_NR_DEC_text_GBR_jp2_29_decode(self): + jfile = os.path.join(data_root, + 'input/nonregression/text_GBR.jp2') + data = Jp2k(jfile).read() + self.assertTrue(True) + + def test_NR_DEC_pacs_ge_j2k_30_decode(self): + jfile = os.path.join(data_root, + 'input/nonregression/pacs.ge.j2k') + data = Jp2k(jfile).read() + self.assertTrue(True) + + def test_NR_DEC_kodak_2layers_lrcp_j2c_31_decode(self): + jfile = os.path.join(data_root, + 'input/nonregression/kodak_2layers_lrcp.j2c') + data = Jp2k(jfile).read() + self.assertTrue(True) + + def test_NR_DEC_kodak_2layers_lrcp_j2c_32_decode(self): + jfile = os.path.join(data_root, + 'input/nonregression/kodak_2layers_lrcp.j2c') + data = Jp2k(jfile).read(layer=2) + self.assertTrue(True) + + def test_NR_DEC_issue104_jpxstream_jp2_33_decode(self): + jfile = os.path.join(data_root, + 'input/nonregression/issue104_jpxstream.jp2') + data = Jp2k(jfile).read() + self.assertTrue(True) + + def test_NR_DEC_mem_b2ace68c_1381_jp2_34_decode(self): + jfile = os.path.join(data_root, + 'input/nonregression/mem-b2ace68c-1381.jp2') + with warnings.catch_warnings(): + # This file has a bad pclr box, we test for this elsewhere. + warnings.simplefilter("ignore") + j = Jp2k(jfile) + data = j.read() + self.assertTrue(True) + + def test_NR_DEC_mem_b2b86b74_2753_jp2_35_decode(self): + jfile = os.path.join(data_root, + 'input/nonregression/mem-b2b86b74-2753.jp2') + data = Jp2k(jfile).read() + self.assertTrue(True) + + def test_NR_DEC_gdal_fuzzer_unchecked_num_resolutions_jp2_36_decode(self): + f = 'input/nonregression/gdal_fuzzer_unchecked_numresolutions.jp2' + jfile = os.path.join(data_root, f) + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + j = Jp2k(jfile) + with self.assertRaises(IOError): + data = j.read() + + def test_NR_DEC_jp2_36_decode(self): + lst = ('input', + 'nonregression', + 'gdal_fuzzer_assert_in_opj_j2k_read_SQcd_SQcc.patch.jp2') + jfile = os.path.join(data_root, '/'.join(lst)) + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + j = Jp2k(jfile) + with self.assertRaises(IOError): + data = j.read() + + def test_NR_DEC_gdal_fuzzer_check_number_of_tiles_jp2_38_decode(self): + relpath = 'input/nonregression/gdal_fuzzer_check_number_of_tiles.jp2' + jfile = os.path.join(data_root, relpath) + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + j = Jp2k(jfile) + with self.assertRaises(IOError): + data = j.read() + + def test_NR_DEC_gdal_fuzzer_check_comp_dx_dy_jp2_39_decode(self): + relpath = 'input/nonregression/gdal_fuzzer_check_comp_dx_dy.jp2' + jfile = os.path.join(data_root, relpath) + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + with self.assertRaises(IOError): + j = Jp2k(jfile).read() + + def test_NR_DEC_file_409752_jp2_40_decode(self): + jfile = os.path.join(data_root, + 'input/nonregression/file409752.jp2') + with self.assertRaises(IOError): + data = Jp2k(jfile).read() + + @unittest.skipIf(sys.hexversion < 0x03020000, + "Uses features introduced in 3.2.") + def test_NR_DEC_issue188_beach_64bitsbox_jp2_41_decode(self): + # Has an 'XML ' box instead of 'xml '. Yes that is pedantic, but it + # really does deserve a warning. + relpath = 'input/nonregression/issue188_beach_64bitsbox.jp2' + jfile = os.path.join(data_root, relpath) + with self.assertWarns(UserWarning) as cw: + data = Jp2k(jfile).read() + + def test_NR_DEC_issue206_image_000_jp2_42_decode(self): + jfile = os.path.join(data_root, + 'input/nonregression/issue206_image-000.jp2') + data = Jp2k(jfile).read() + self.assertTrue(True) + + def test_NR_DEC_p1_04_j2k_43_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p1_04.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(0, 0, 1024, 1024)) + odata = jp2k.read() + np.testing.assert_array_equal(ssdata, odata) + + def test_NR_DEC_p1_04_j2k_44_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p1_04.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(640, 512, 768, 640)) + odata = jp2k.read() + np.testing.assert_array_equal(ssdata, odata[640:768, 512:640]) + + def test_NR_DEC_p1_04_j2k_45_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p1_04.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(896, 896, 1024, 1024)) + odata = jp2k.read() + np.testing.assert_array_equal(ssdata, odata[896:1024, 896:1024]) + + def test_NR_DEC_p1_04_j2k_46_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p1_04.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(500, 100, 800, 300)) + odata = jp2k.read() + np.testing.assert_array_equal(ssdata, odata[500:800, 100:300]) + + def test_NR_DEC_p1_04_j2k_47_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p1_04.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(520, 260, 600, 360)) + odata = jp2k.read() + np.testing.assert_array_equal(ssdata, odata[520:600, 260:360]) + + def test_NR_DEC_p1_04_j2k_48_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p1_04.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(520, 260, 660, 360)) + odata = jp2k.read() + np.testing.assert_array_equal(ssdata, odata[520:660, 260:360]) + + def test_NR_DEC_p1_04_j2k_49_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p1_04.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(520, 360, 600, 400)) + odata = jp2k.read() + np.testing.assert_array_equal(ssdata, odata[520:600, 360:400]) + + def test_NR_DEC_p1_04_j2k_50_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p1_04.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(0, 0, 1024, 1024), reduce=2) + odata = jp2k.read(reduce=2) + + np.testing.assert_array_equal(ssdata, odata[0:256, 0:256]) + + def test_NR_DEC_p1_04_j2k_51_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p1_04.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(640, 512, 768, 640), reduce=2) + odata = jp2k.read(reduce=2) + np.testing.assert_array_equal(ssdata, odata[160:192, 128:160]) + + def test_NR_DEC_p1_04_j2k_52_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p1_04.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(896, 896, 1024, 1024), reduce=2) + odata = jp2k.read(reduce=2) + np.testing.assert_array_equal(ssdata, odata[224:352, 224:352]) + + def test_NR_DEC_p1_04_j2k_53_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p1_04.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(500, 100, 800, 300), reduce=2) + odata = jp2k.read(reduce=2) + np.testing.assert_array_equal(ssdata, odata[125:200, 25:75]) + + def test_NR_DEC_p1_04_j2k_54_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p1_04.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(520, 260, 600, 360), reduce=2) + odata = jp2k.read(reduce=2) + np.testing.assert_array_equal(ssdata, odata[130:150, 65:90]) + + def test_NR_DEC_p1_04_j2k_55_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p1_04.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(520, 260, 660, 360), reduce=2) + odata = jp2k.read(reduce=2) + np.testing.assert_array_equal(ssdata, odata[130:165, 65:90]) + + def test_NR_DEC_p1_04_j2k_56_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p1_04.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(520, 360, 600, 400), reduce=2) + odata = jp2k.read(reduce=2) + np.testing.assert_array_equal(ssdata, odata[130:150, 90:100]) + + def test_NR_DEC_p1_04_j2k_57_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p1_04.j2k') + jp2k = Jp2k(jfile) + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + tdata = jp2k.read(tile=63) # last tile + odata = jp2k.read() + np.testing.assert_array_equal(tdata, odata[896:1024, 896:1024]) + + def test_NR_DEC_p1_04_j2k_58_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p1_04.j2k') + jp2k = Jp2k(jfile) + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + tdata = jp2k.read(tile=63, reduce=2) # last tile + odata = jp2k.read(reduce=2) + np.testing.assert_array_equal(tdata, odata[224:256, 224:256]) + + def test_NR_DEC_p1_04_j2k_59_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p1_04.j2k') + jp2k = Jp2k(jfile) + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + tdata = jp2k.read(tile=12) # 2nd row, 5th column + odata = jp2k.read() + np.testing.assert_array_equal(tdata, odata[128:256, 512:640]) + + def test_NR_DEC_p1_04_j2k_60_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p1_04.j2k') + jp2k = Jp2k(jfile) + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + tdata = jp2k.read(tile=12, reduce=1) # 2nd row, 5th column + odata = jp2k.read(reduce=1) + np.testing.assert_array_equal(tdata, odata[64:128, 256:320]) + + def test_NR_DEC_p1_06_j2k_61_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p1_06.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(0, 0, 12, 12)) + odata = jp2k.read() + np.testing.assert_array_equal(ssdata, odata[0:12, 0:12]) + + def test_NR_DEC_p1_06_j2k_62_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p1_06.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(1, 8, 8, 11)) + odata = jp2k.read() + np.testing.assert_array_equal(ssdata, odata[1:8, 8:11]) + + def test_NR_DEC_p1_06_j2k_63_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p1_06.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(9, 9, 12, 12)) + odata = jp2k.read() + np.testing.assert_array_equal(ssdata, odata[9:12, 9:12]) + + def test_NR_DEC_p1_06_j2k_64_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p1_06.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(10, 4, 12, 10)) + odata = jp2k.read() + np.testing.assert_array_equal(ssdata, odata[10:12, 4:10]) + + def test_NR_DEC_p1_06_j2k_65_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p1_06.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(3, 3, 9, 9)) + odata = jp2k.read() + np.testing.assert_array_equal(ssdata, odata[3:9, 3:9]) + + def test_NR_DEC_p1_06_j2k_66_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p1_06.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(4, 4, 7, 7)) + odata = jp2k.read() + np.testing.assert_array_equal(ssdata, odata[4:7, 4:7]) + + def test_NR_DEC_p1_06_j2k_67_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p1_06.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(4, 4, 5, 5)) + odata = jp2k.read() + np.testing.assert_array_equal(ssdata, odata[4:5, 4: 5]) + + def test_NR_DEC_p1_06_j2k_68_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p1_06.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(0, 0, 12, 12), reduce=1) + odata = jp2k.read(reduce=1) + np.testing.assert_array_equal(ssdata, odata[0:6, 0:6]) + + def test_NR_DEC_p1_06_j2k_69_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p1_06.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(1, 8, 8, 11), reduce=1) + self.assertEqual(ssdata.shape, (3, 2, 3)) + + def test_NR_DEC_p1_06_j2k_70_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p1_06.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(9, 9, 12, 12), reduce=1) + self.assertEqual(ssdata.shape, (1, 1, 3)) + + def test_NR_DEC_p1_06_j2k_71_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p1_06.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(10, 4, 12, 10), reduce=1) + self.assertEqual(ssdata.shape, (1, 3, 3)) + + def test_NR_DEC_p1_06_j2k_72_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p1_06.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(3, 3, 9, 9), reduce=1) + self.assertEqual(ssdata.shape, (3, 3, 3)) + + def test_NR_DEC_p1_06_j2k_73_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p1_06.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(4, 4, 7, 7), reduce=1) + self.assertEqual(ssdata.shape, (2, 2, 3)) + + def test_NR_DEC_p1_06_j2k_74_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p1_06.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(4, 4, 5, 5), reduce=1) + self.assertEqual(ssdata.shape, (1, 1, 3)) + + def test_NR_DEC_p1_06_j2k_75_decode(self): + # Image size would be 0 x 0. + jfile = os.path.join(data_root, 'input/conformance/p1_06.j2k') + jp2k = Jp2k(jfile) + with self.assertRaises((IOError, OSError)) as ce: + ssdata = jp2k.read(area=(9, 9, 12, 12), reduce=2) + + def test_NR_DEC_p1_06_j2k_76_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p1_06.j2k') + jp2k = Jp2k(jfile) + fulldata = jp2k.read() + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + tiledata = jp2k.read(tile=0) + np.testing.assert_array_equal(tiledata, fulldata[0:3, 0:3]) + + def test_NR_DEC_p1_06_j2k_77_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p1_06.j2k') + jp2k = Jp2k(jfile) + fulldata = jp2k.read() + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + tiledata = jp2k.read(tile=5) + np.testing.assert_array_equal(tiledata, fulldata[3:6, 3:6]) + + def test_NR_DEC_p1_06_j2k_78_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p1_06.j2k') + jp2k = Jp2k(jfile) + fulldata = jp2k.read() + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + tiledata = jp2k.read(tile=9) + np.testing.assert_array_equal(tiledata, fulldata[6:9, 3:6]) + + def test_NR_DEC_p1_06_j2k_79_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p1_06.j2k') + jp2k = Jp2k(jfile) + fulldata = jp2k.read() + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + tiledata = jp2k.read(tile=15) + np.testing.assert_array_equal(tiledata, fulldata[9:12, 9:12]) + + def test_NR_DEC_p1_06_j2k_80_decode(self): + # Just read the data, don't bother verifying. + jfile = os.path.join(data_root, 'input/conformance/p1_06.j2k') + jp2k = Jp2k(jfile) + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + tiledata = jp2k.read(tile=0, reduce=2) + + def test_NR_DEC_p1_06_j2k_81_decode(self): + # Just read the data, don't bother verifying. + jfile = os.path.join(data_root, 'input/conformance/p1_06.j2k') + jp2k = Jp2k(jfile) + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + tiledata = jp2k.read(tile=5, reduce=2) + + def test_NR_DEC_p1_06_j2k_82_decode(self): + # Just read the data, don't bother verifying. + jfile = os.path.join(data_root, 'input/conformance/p1_06.j2k') + jp2k = Jp2k(jfile) + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + tiledata = jp2k.read(tile=9, reduce=2) + + def test_NR_DEC_p1_06_j2k_83_decode(self): + # tile size is 3x3. Reducing two levels results in no data. + jfile = os.path.join(data_root, 'input/conformance/p1_06.j2k') + jp2k = Jp2k(jfile) + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + with self.assertRaises((IOError, OSError)) as ce: + tiledata = jp2k.read(tile=15, reduce=2) + + def test_NR_DEC_p1_06_j2k_84_decode(self): + # Just read the data, don't bother verifying. + jfile = os.path.join(data_root, 'input/conformance/p1_06.j2k') + jp2k = Jp2k(jfile) + tiledata = jp2k.read(reduce=4) + + def test_NR_DEC_p0_04_j2k_85_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p0_04.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(0, 0, 256, 256)) + fulldata = jp2k.read() + np.testing.assert_array_equal(fulldata[0:256, 0:256], ssdata) + + def test_NR_DEC_p0_04_j2k_86_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p0_04.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(0, 128, 128, 256)) + fulldata = jp2k.read() + np.testing.assert_array_equal(fulldata[0:128, 128:256], ssdata) + + def test_NR_DEC_p0_04_j2k_87_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p0_04.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(10, 50, 200, 120)) + fulldata = jp2k.read() + np.testing.assert_array_equal(fulldata[10:200, 50:120], ssdata) + + def test_NR_DEC_p0_04_j2k_88_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p0_04.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(150, 10, 210, 190)) + fulldata = jp2k.read() + np.testing.assert_array_equal(fulldata[150:210, 10:190], ssdata) + + def test_NR_DEC_p0_04_j2k_89_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p0_04.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(80, 100, 150, 200)) + fulldata = jp2k.read() + np.testing.assert_array_equal(fulldata[80:150, 100:200], ssdata) + + def test_NR_DEC_p0_04_j2k_90_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p0_04.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(20, 150, 50, 200)) + fulldata = jp2k.read() + np.testing.assert_array_equal(fulldata[20:50, 150:200], ssdata) + + def test_NR_DEC_p0_04_j2k_91_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p0_04.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(0, 0, 256, 256), reduce=2) + fulldata = jp2k.read(reduce=2) + np.testing.assert_array_equal(fulldata[0:64, 0:64], ssdata) + + def test_NR_DEC_p0_04_j2k_92_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p0_04.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(0, 128, 128, 256), reduce=2) + fulldata = jp2k.read(reduce=2) + np.testing.assert_array_equal(fulldata[0:32, 32:64], ssdata) + + def test_NR_DEC_p0_04_j2k_93_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p0_04.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(10, 50, 200, 120), reduce=2) + fulldata = jp2k.read(reduce=2) + np.testing.assert_array_equal(fulldata[3:50, 13:30], ssdata) + + def test_NR_DEC_p0_04_j2k_94_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p0_04.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(150, 10, 210, 190), reduce=2) + fulldata = jp2k.read(reduce=2) + np.testing.assert_array_equal(fulldata[38:53, 3:48], ssdata) + + def test_NR_DEC_p0_04_j2k_95_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p0_04.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(80, 100, 150, 200), reduce=2) + fulldata = jp2k.read(reduce=2) + np.testing.assert_array_equal(fulldata[20:38, 25:50], ssdata) + + def test_NR_DEC_p0_04_j2k_96_decode(self): + jfile = os.path.join(data_root, 'input/conformance/p0_04.j2k') + jp2k = Jp2k(jfile) + ssdata = jp2k.read(area=(20, 150, 50, 200), reduce=2) + fulldata = jp2k.read(reduce=2) + np.testing.assert_array_equal(fulldata[5:13, 38:50], ssdata) + +if __name__ == "__main__": + unittest.main() diff --git a/glymur/test/test_opj_suite_neg.py b/glymur/test/test_opj_suite_neg.py new file mode 100644 index 0000000..8296861 --- /dev/null +++ b/glymur/test/test_opj_suite_neg.py @@ -0,0 +1,154 @@ +""" +The tests here do not correspond directly to the OpenJPEG test suite, but +seem like logical negative tests to add. +""" +import os +import sys +import tempfile +import unittest +import warnings + +import numpy as np + +from ..lib import openjp2 as opj2 + +# Need some combination of matplotlib, PIL, or scikits-image for reading +# other image formats. +no_read_backend = False +msg = "Either scikit-image with the freeimage backend or matplotlib " +msg += "with the PIL backend must be available in order to run the " +msg += "tests in this suite." +no_read_backend_msg = msg +try: + import skimage.io + try: + skimage.io.use_plugin('freeimage') + from skimage.io import imread + except ImportError: + try: + skimage.io.use_plugin('PIL') + from skimage.io import imread + except ImportError: + raise +except ImportError: + try: + from PIL import Image + from matplotlib.pyplot import imread + except ImportError: + no_read_backend = True + +from glymur import Jp2k +import glymur + +try: + data_root = os.environ['OPJ_DATA_ROOT'] +except KeyError: + data_root = None +except: + raise + + +def read_image(infile): + # PIL issues warnings which we do not care about, so suppress them. + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + data = imread(infile) + return data + + +@unittest.skipIf(no_read_backend, no_read_backend_msg) +@unittest.skipIf(data_root is None, + "OPJ_DATA_ROOT environment variable not set") +class TestSuiteNegative(unittest.TestCase): + + def setUp(self): + pass + + def tearDown(self): + pass + + def test_negative_psnr_with_cratios(self): + # Using psnr with cratios options is not allowed. + # Not an OpenJPEG test, but close. + infile = os.path.join(data_root, 'input/nonregression/Bretagne1.ppm') + data = read_image(infile) + with tempfile.NamedTemporaryFile(suffix='.j2k') as tfile: + j = Jp2k(tfile.name, 'wb') + with self.assertRaises(RuntimeError): + j.write(data, psnr=[30, 35, 40], cratios=[2, 3, 4]) + + @unittest.skipIf(sys.hexversion < 0x03020000, + "Uses features introduced in 3.2.") + def test_NR_MarkerIsNotCompliant_j2k_dump(self): + # SOT marker gives bad offset. + relpath = 'input/nonregression/MarkerIsNotCompliant.j2k' + jfile = os.path.join(data_root, relpath) + jp2k = Jp2k(jfile) + with self.assertWarns(UserWarning) as cw: + c = jp2k.get_codestream(header_only=False) + + # Verify that the last segment returned in the codestream is SOD, + # not EOC. Codestream parsing should stop when we try to jump to + # the end of SOT. + self.assertEqual(c.segment[-1].id, 'SOD') + + @unittest.skipIf(sys.hexversion < 0x03020000, + "Uses features introduced in 3.2.") + def test_NR_illegalcolortransform_dump(self): + # SOT marker gives bad offset. + relpath = 'input/nonregression/illegalcolortransform.j2k' + jfile = os.path.join(data_root, relpath) + jp2k = Jp2k(jfile) + with self.assertWarns(UserWarning) as cw: + c = jp2k.get_codestream(header_only=False) + + # Verify that the last segment returned in the codestream is SOD, + # not EOC. Codestream parsing should stop when we try to jump to + # the end of SOT. + self.assertEqual(c.segment[-1].id, 'SOD') + + @unittest.skipIf(sys.hexversion < 0x03020000, + "Uses features introduced in 3.2.") + def test_NR_Cannotreaddatawithnosizeknown_j2k(self): + # SOT marker gives bad offset. + relpath = 'input/nonregression/Cannotreaddatawithnosizeknown.j2k' + jfile = os.path.join(data_root, relpath) + jp2k = Jp2k(jfile) + with self.assertWarns(UserWarning) as cw: + c = jp2k.get_codestream(header_only=False) + + # Verify that the last segment returned in the codestream is SOD, + # not EOC. Codestream parsing should stop when we try to jump to + # the end of SOT. + self.assertEqual(c.segment[-1].id, 'SOD') + + def test_code_block_dimensions(self): + # opj_compress doesn't allow the dimensions of a codeblock + # to be too small or too big, so neither will we. + data = np.zeros((256, 256), dtype=np.uint8) + with tempfile.NamedTemporaryFile(suffix='.j2k') as tfile: + j = Jp2k(tfile.name, 'wb') + + # opj_compress doesn't allow code block area to exceed 4096. + with self.assertRaises(RuntimeError) as cr: + j.write(data, cbsize=(256, 256)) + + # opj_compress doesn't allow either dimension to be less than 4. + with self.assertRaises(RuntimeError) as cr: + j.write(data, cbsize=(2048, 2)) + with self.assertRaises(RuntimeError) as cr: + j.write(data, cbsize=(2, 2048)) + + @unittest.skipIf(sys.hexversion < 0x03020000, + "Uses features introduced in 3.2.") + def test_exceeded_box(self): + # Verify that a warning is issued if we read past the end of a box + # This file has a palette (pclr) box whose length is impossibly + # short. + infile = os.path.join(data_root, + 'input/nonregression/mem-b2ace68c-1381.jp2') + with self.assertWarns(UserWarning) as cw: + j = Jp2k(infile) + +if __name__ == "__main__": + unittest.main() diff --git a/glymur/test/test_opj_suite_write.py b/glymur/test/test_opj_suite_write.py new file mode 100644 index 0000000..486521f --- /dev/null +++ b/glymur/test/test_opj_suite_write.py @@ -0,0 +1,809 @@ +""" +The tests defined here roughly correspond to what is in the OpenJPEG test +suite. +""" +import os +import platform +import sys +import tempfile +import unittest +import warnings + +import numpy as np + +from ..lib import openjp2 as opj2 + +# Need some combination of matplotlib, PIL, or scikits-image for reading +# other image formats. +no_read_backend = False +msg = "Either scikit-image with the freeimage backend or matplotlib " +msg += "with the PIL backend must be available in order to run the " +msg += "tests in this suite." +no_read_backend_msg = msg +try: + import skimage.io + try: + skimage.io.use_plugin('freeimage') + from skimage.io import imread + except ImportError: + try: + skimage.io.use_plugin('PIL') + from skimage.io import imread + except ImportError: + raise +except ImportError: + try: + from PIL import Image + from matplotlib.pyplot import imread + except ImportError: + no_read_backend = True + +from glymur import Jp2k +import glymur + +try: + data_root = os.environ['OPJ_DATA_ROOT'] +except KeyError: + data_root = None +except: + raise + + +def read_image(infile): + # PIL issues warnings which we do not care about, so suppress them. + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + data = imread(infile) + return data + + +@unittest.skipIf(no_read_backend, no_read_backend_msg) +@unittest.skipIf(data_root is None, + "OPJ_DATA_ROOT environment variable not set") +class TestSuiteWrite(unittest.TestCase): + + def setUp(self): + pass + + def tearDown(self): + pass + + def test_NR_ENC_Bretagne1_ppm_1_encode(self): + # NR-ENC-Bretagne1.ppm-1-encode + infile = os.path.join(data_root, 'input/nonregression/Bretagne1.ppm') + data = read_image(infile) + with tempfile.NamedTemporaryFile(suffix='.j2k') as tfile: + j = Jp2k(tfile.name, 'wb') + j.write(data, cratios=[200, 100, 50]) + + # Should be three layers. + c = j.get_codestream() + + # SIZ: Image and tile size + # Profile: "0" means profile 2 + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual((c.segment[1].Xsiz, c.segment[1].Ysiz), + (640, 480)) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), + (640, 480)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), + (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8, 8, 8)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 3) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 3) # layers = 3 + self.assertEqual(c.segment[2].SPcod[3], 1) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # levels + self.assertEqual(tuple(c.segment[2]._code_block_size), + (64, 64)) # cblksz + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + def test_NR_ENC_Bretagne1_ppm_2_encode(self): + # NR-ENC-Bretagne1.ppm-2-encode + infile = os.path.join(data_root, 'input/nonregression/Bretagne1.ppm') + data = read_image(infile) + with tempfile.NamedTemporaryFile(suffix='.j2k') as tfile: + j = Jp2k(tfile.name, 'wb') + j.write(data, psnr=[30, 35, 40], numres=2) + + # Should be three layers. + c = j.get_codestream() + + # SIZ: Image and tile size + # Profile: "0" means profile 2 + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual((c.segment[1].Xsiz, c.segment[1].Ysiz), + (640, 480)) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), + (640, 480)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), + (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8, 8, 8)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 3) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 3) # layers = 3 + self.assertEqual(c.segment[2].SPcod[3], 1) # mct + self.assertEqual(c.segment[2].SPcod[4], 1) # levels + self.assertEqual(tuple(c.segment[2]._code_block_size), + (64, 64)) # cblksz + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + def test_NR_ENC_Bretagne1_ppm_3_encode(self): + # NR-ENC-Bretagne1.ppm-3-encode + infile = os.path.join(data_root, 'input/nonregression/Bretagne1.ppm') + data = read_image(infile) + with tempfile.NamedTemporaryFile(suffix='.j2k') as tfile: + j = Jp2k(tfile.name, 'wb') + j.write(data, psnr=[30, 35, 40], cbsize=(16, 16), + psizes=[(64, 64)]) + + # Should be three layers. + c = j.get_codestream() + + # SIZ: Image and tile size + # Profile: "0" means profile 2 + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual((c.segment[1].Xsiz, c.segment[1].Ysiz), + (640, 480)) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), + (640, 480)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), + (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8, 8, 8)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 3) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 3) # layers = 3 + self.assertEqual(c.segment[2].SPcod[3], 1) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # levels + self.assertEqual(tuple(c.segment[2]._code_block_size), + (16, 16)) # cblksz + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(c.segment[2]._precinct_size, + [(2, 2), (4, 4), (8, 8), (16, 16), (32, 32), + (64, 64)]) + + def test_NR_ENC_Bretagne2_ppm_4_encode(self): + infile = os.path.join(data_root, 'input/nonregression/Bretagne2.ppm') + data = read_image(infile) + with tempfile.NamedTemporaryFile(suffix='.j2k') as tfile: + j = Jp2k(tfile.name, 'wb') + j.write(data, + psizes=[(128, 128)] * 3, + cratios=[100, 20, 2], + tilesize=(480, 640), + cbsize=(32, 32)) + + # Should be three layers. + c = j.get_codestream() + + # SIZ: Image and tile size + # Profile: "0" means profile 2 + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual((c.segment[1].Xsiz, c.segment[1].Ysiz), + (data.shape[1], data.shape[0])) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size. Reported as XY, not RC. + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), + (640, 480)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), + (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8, 8, 8)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 3) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 3) # layers = 3 + self.assertEqual(c.segment[2].SPcod[3], 1) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # levels + self.assertEqual(tuple(c.segment[2]._code_block_size), + (32, 32)) # cblksz + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(c.segment[2]._precinct_size, + [(16, 16), (32, 32), (64, 64)] + [(128, 128)] * 3) + + def test_NR_ENC_Bretagne2_ppm_5_encode(self): + # NR-ENC-Bretagne2.ppm-4-encode + infile = os.path.join(data_root, 'input/nonregression/Bretagne2.ppm') + data = read_image(infile) + with tempfile.NamedTemporaryFile(suffix='.j2k') as tfile: + j = Jp2k(tfile.name, 'wb') + j.write(data, tilesize=(127, 127), prog="PCRL") + + c = j.get_codestream() + + # SIZ: Image and tile size + # Profile: "0" means profile 2 + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual((c.segment[1].Xsiz, c.segment[1].Ysiz), + (data.shape[1], data.shape[0])) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), + (127, 127)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), + (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8, 8, 8)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 3) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.PCRL) + self.assertEqual(c.segment[2]._layers, 1) # layers = 1 + self.assertEqual(c.segment[2].SPcod[3], 1) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # levels + self.assertEqual(tuple(c.segment[2]._code_block_size), + (64, 64)) # cblksz + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + def test_NR_ENC_Bretagne2_ppm_6_encode(self): + # NR-ENC-Bretagne2.ppm-6-encode + infile = os.path.join(data_root, 'input/nonregression/Bretagne2.ppm') + data = read_image(infile) + with tempfile.NamedTemporaryFile(suffix='.j2k') as tfile: + j = Jp2k(tfile.name, 'wb') + j.write(data, subsam=(2, 2), sop=True) + + c = j.get_codestream(header_only=False) + + # SIZ: Image and tile size + # Profile: "0" means profile 2 + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual((c.segment[1].Xsiz, c.segment[1].Ysiz), + (5183, 3887)) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), + (5183, 3887)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), + (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8, 8, 8)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(2, 2)] * 3) + + # COD: Coding style default + self.assertTrue(c.segment[2].Scod & 2) # sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 1) # layers = 1 + self.assertEqual(c.segment[2].SPcod[3], 1) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # levels + self.assertEqual(tuple(c.segment[2]._code_block_size), + (64, 64)) # cblksz + # Selective arithmetic coding bypass + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # Reset context probabilities + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # 18 SOP segments. + nsops = [x.Nsop for x in c.segment if x.id == 'SOP'] + self.assertEqual(nsops, list(range(18))) + + def test_NR_ENC_Bretagne2_ppm_7_encode(self): + infile = os.path.join(data_root, 'input/nonregression/Bretagne2.ppm') + data = read_image(infile) + with tempfile.NamedTemporaryFile(suffix='.j2k') as tfile: + j = Jp2k(tfile.name, 'wb') + j.write(data, modesw=38, eph=True) + + c = j.get_codestream(header_only=False) + + # SIZ: Image and tile size + # Profile: "0" means profile 2 + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual((c.segment[1].Xsiz, c.segment[1].Ysiz), + (2592, 1944)) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), + (2592, 1944)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), + (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8, 8, 8)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 3) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertTrue(c.segment[2].Scod & 4) # eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 1) # layers = 1 + self.assertEqual(c.segment[2].SPcod[3], 1) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # levels + self.assertEqual(tuple(c.segment[2]._code_block_size), + (64, 64)) # cblksz + # Selective arithmetic coding BYPASS + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # RESET context probabilities (RESET) + self.assertTrue(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass, RESTART(TERMALL) + self.assertTrue(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context (VSC) + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination, ERTERM(SEGTERM) + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols, SEGMARK(SEGSYSM) + self.assertTrue(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + # 18 EPH segments. + ephs = [x for x in c.segment if x.id == 'EPH'] + self.assertEqual(len(ephs), 18) + + def test_NR_ENC_Bretagne2_ppm_8_encode(self): + infile = os.path.join(data_root, 'input/nonregression/Bretagne2.ppm') + data = read_image(infile) + with tempfile.NamedTemporaryFile(suffix='.j2k') as tfile: + j = Jp2k(tfile.name, 'wb') + j.write(data, grid_offset=[300, 150], cratios=[800]) + + c = j.get_codestream(header_only=False) + + # SIZ: Image and tile size + # Profile: "0" means profile 2 + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual((c.segment[1].Xsiz, c.segment[1].Ysiz), + (2742, 2244)) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), + (150, 300)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), + (2742, 2244)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), + (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8, 8, 8)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 3) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 1) # layers = 1 + self.assertEqual(c.segment[2].SPcod[3], 1) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # levels + self.assertEqual(tuple(c.segment[2]._code_block_size), + (64, 64)) # cblksz + # Selective arithmetic coding BYPASS + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # RESET context probabilities (RESET) + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass, RESTART(TERMALL) + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context (VSC) + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination, ERTERM(SEGTERM) + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols, SEGMARK(SEGSYSM) + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + def test_NR_ENC_Cevennes1_bmp_9_encode(self): + infile = os.path.join(data_root, 'input/nonregression/Cevennes1.bmp') + data = read_image(infile) + with tempfile.NamedTemporaryFile(suffix='.j2k') as tfile: + j = Jp2k(tfile.name, 'wb') + j.write(data, cratios=[800]) + + c = j.get_codestream(header_only=False) + + # SIZ: Image and tile size + # Profile: "0" means profile 2 + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual((c.segment[1].Xsiz, c.segment[1].Ysiz), + (2592, 1944)) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), + (2592, 1944)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), + (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8, 8, 8)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 3) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 1) # layers = 1 + self.assertEqual(c.segment[2].SPcod[3], 1) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # levels + self.assertEqual(tuple(c.segment[2]._code_block_size), + (64, 64)) # cblksz + # Selective arithmetic coding BYPASS + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # RESET context probabilities (RESET) + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass, RESTART(TERMALL) + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context (VSC) + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination, ERTERM(SEGTERM) + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols, SEGMARK(SEGSYSM) + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + def test_NR_ENC_Cevennes2_ppm_10_encode(self): + infile = os.path.join(data_root, 'input/nonregression/Cevennes2.ppm') + data = read_image(infile) + with tempfile.NamedTemporaryFile(suffix='.j2k') as tfile: + j = Jp2k(tfile.name, 'wb') + j.write(data, cratios=[50]) + + c = j.get_codestream(header_only=False) + + # SIZ: Image and tile size + # Profile: "0" means profile 2 + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual((c.segment[1].Xsiz, c.segment[1].Ysiz), + (640, 480)) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), + (640, 480)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), + (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8, 8, 8)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 3) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 1) # layers = 1 + self.assertEqual(c.segment[2].SPcod[3], 1) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # levels + self.assertEqual(tuple(c.segment[2]._code_block_size), + (64, 64)) # cblksz + # Selective arithmetic coding BYPASS + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # RESET context probabilities (RESET) + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass, RESTART(TERMALL) + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context (VSC) + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination, ERTERM(SEGTERM) + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols, SEGMARK(SEGSYSM) + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + def test_NR_ENC_Rome_bmp_11_encode(self): + infile = os.path.join(data_root, 'input/nonregression/Rome.bmp') + data = read_image(infile) + with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile: + jp2 = Jp2k(tfile.name, 'wb') + jp2.write(data, psnr=[30, 35, 50], prog='LRCP', numres=3) + + ids = [box.id for box in jp2.box] + lst = ['jP ', 'ftyp', 'jp2h', 'jp2c'] + self.assertEqual(ids, lst) + + ids = [box.id for box in jp2.box[2].box] + self.assertEqual(ids, ['ihdr', 'colr']) + + # Signature box. Check for corruption. + self.assertEqual(jp2.box[0].signature, (13, 10, 135, 10)) + + # File type box. + self.assertEqual(jp2.box[1].brand, 'jp2 ') + self.assertEqual(jp2.box[1].minor_version, 0) + self.assertEqual(jp2.box[1].compatibility_list[0], 'jp2 ') + + # Jp2 Header + # Image header + self.assertEqual(jp2.box[2].box[0].height, 480) + self.assertEqual(jp2.box[2].box[0].width, 640) + self.assertEqual(jp2.box[2].box[0].num_components, 3) + self.assertEqual(jp2.box[2].box[0].bits_per_component, 8) + self.assertEqual(jp2.box[2].box[0].signed, False) + self.assertEqual(jp2.box[2].box[0].compression, 7) # wavelet + self.assertEqual(jp2.box[2].box[0].cspace_unknown, False) + self.assertEqual(jp2.box[2].box[0].ip_provided, False) + + # Jp2 Header + # Colour specification + self.assertEqual(jp2.box[2].box[1].method, 1) + self.assertEqual(jp2.box[2].box[1].precedence, 0) + self.assertEqual(jp2.box[2].box[1].approximation, 0) + self.assertIsNone(jp2.box[2].box[1].icc_profile) + self.assertEqual(jp2.box[2].box[1].color_space, glymur.core.SRGB) + + c = jp2.box[3].main_header + + # SIZ: Image and tile size + # Profile: "0" means profile 2 + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual((c.segment[1].Xsiz, c.segment[1].Ysiz), + (640, 480)) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), + (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), + (640, 480)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), + (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (8, 8, 8)) + # signed + self.assertEqual(c.segment[1]._signed, (False, False, False)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)] * 3) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 3) # layers = 3 + self.assertEqual(c.segment[2].SPcod[3], 1) # mct + self.assertEqual(c.segment[2].SPcod[4], 2) # levels + self.assertEqual(tuple(c.segment[2]._code_block_size), + (64, 64)) # cblksz + # Selective arithmetic coding BYPASS + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # RESET context probabilities (RESET) + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass, RESTART(TERMALL) + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context (VSC) + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination, ERTERM(SEGTERM) + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols, SEGMARK(SEGSYSM) + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + + @unittest.skip("Known failure in openjpeg test suite.") + def test_NR_ENC_random_issue_0005_tif_12_encode(self): + # opj_decompress has trouble reading it, but that is not an issue here. + # The nature of the image itself seems to give the compressor trouble. + infile = os.path.join(data_root, + 'input/nonregression/random-issue-0005.tif') + data = read_image(infile) + with tempfile.NamedTemporaryFile(suffix='.j2k') as tfile: + j = Jp2k(tfile.name, 'wb') + j.write(data) + + c = j.get_codestream(header_only=False) + + # SIZ: Image and tile size + # Profile: "0" means profile 2 + self.assertEqual(c.segment[1].Rsiz, 0) + # Reference grid size + self.assertEqual((c.segment[1].Xsiz, c.segment[1].Ysiz), + (1024, 1024)) + # Reference grid offset + self.assertEqual((c.segment[1].XOsiz, c.segment[1].YOsiz), (0, 0)) + # Tile size + self.assertEqual((c.segment[1].XTsiz, c.segment[1].YTsiz), + (1024, 1024)) + # Tile offset + self.assertEqual((c.segment[1].XTOsiz, c.segment[1].YTOsiz), + (0, 0)) + # bitdepth + self.assertEqual(c.segment[1]._bitdepth, (16,)) + # signed + self.assertEqual(c.segment[1]._signed, (False,)) + # subsampling + self.assertEqual(list(zip(c.segment[1].XRsiz, c.segment[1].YRsiz)), + [(1, 1)]) + + # COD: Coding style default + self.assertFalse(c.segment[2].Scod & 2) # no sop + self.assertFalse(c.segment[2].Scod & 4) # no eph + self.assertEqual(c.segment[2].SPcod[0], glymur.core.LRCP) + self.assertEqual(c.segment[2]._layers, 1) # layers = 1 + self.assertEqual(c.segment[2].SPcod[3], 0) # mct + self.assertEqual(c.segment[2].SPcod[4], 5) # levels + self.assertEqual(tuple(c.segment[2]._code_block_size), + (64, 64)) # cblksz + # Selective arithmetic coding BYPASS + self.assertFalse(c.segment[2].SPcod[7] & 0x01) + # RESET context probabilities (RESET) + self.assertFalse(c.segment[2].SPcod[7] & 0x02) + # Termination on each coding pass, RESTART(TERMALL) + self.assertFalse(c.segment[2].SPcod[7] & 0x04) + # Vertically causal context (VSC) + self.assertFalse(c.segment[2].SPcod[7] & 0x08) + # Predictable termination, ERTERM(SEGTERM) + self.assertFalse(c.segment[2].SPcod[7] & 0x0010) + # Segmentation symbols, SEGMARK(SEGSYSM) + self.assertFalse(c.segment[2].SPcod[7] & 0x0020) + self.assertEqual(c.segment[2].SPcod[8], + glymur.core.WAVELET_TRANSFORM_5x3_REVERSIBLE) + self.assertEqual(len(c.segment[2].SPcod), 9) + +if __name__ == "__main__": + unittest.main() diff --git a/glymur/test/test_printing.py b/glymur/test/test_printing.py new file mode 100644 index 0000000..299085d --- /dev/null +++ b/glymur/test/test_printing.py @@ -0,0 +1,767 @@ +import os +import pkg_resources +import struct +import sys +import tempfile +import unittest + +if sys.hexversion < 0x03000000: + from StringIO import StringIO +else: + from io import StringIO + +import glymur + +try: + data_root = os.environ['OPJ_DATA_ROOT'] +except KeyError: + data_root = None +except: + raise + + +class TestPrinting(unittest.TestCase): + + def setUp(self): + # Save sys.stdout. + self.stdout = sys.stdout + sys.stdout = StringIO() + self.jp2file = pkg_resources.resource_filename(glymur.__name__, + "data/nemo.jp2") + + # Save the output of dumping nemo.jp2 for more than one test. + lines = ['File: nemo.jp2', + 'JPEG 2000 Signature Box (jP ) @ (0, 12)', + ' Signature: 0d0a870a', + 'File Type Box (ftyp) @ (12, 20)', + ' Brand: jp2 ', + " Compatibility: ['jp2 ']", + 'JP2 Header Box (jp2h) @ (32, 45)', + ' Image Header Box (ihdr) @ (40, 22)', + ' Size: [1456 2592 3]', + ' Bitdepth: 8', + ' Signed: False', + ' Compression: wavelet', + ' Colorspace Unknown: False', + ' Colour Specification Box (colr) @ (62, 15)', + ' Method: enumerated colorspace', + ' Precedence: 0', + ' Colorspace: sRGB', + 'Contiguous Codestream Box (jp2c) @ (77, 1133427)', + ' Main header:', + ' SOC marker segment @ (85, 0)', + ' SIZ marker segment @ (87, 47)', + ' Profile: 2', + ' Reference Grid Height, Width: (1456 x 2592)', + ' Vertical, Horizontal Reference Grid Offset: ' + + '(0 x 0)', + ' Reference Tile Height, Width: (512 x 512)', + ' Vertical, Horizontal Reference Tile Offset: ' + + '(0 x 0)', + ' Bitdepth: (8, 8, 8)', + ' Signed: (False, False, False)', + ' Vertical, Horizontal Subsampling: ' + + '((1, 1), (1, 1), (1, 1))', + ' COD marker segment @ (136, 12)', + ' Coding style:', + ' Entropy coder, without partitions', + ' SOP marker segments: False', + ' EPH marker segments: False', + ' Coding style parameters:', + ' Progression order: LRCP', + ' Number of layers: 3', + ' Multiple component transformation usage: ' + + 'reversible', + ' Number of resolutions: 6', + ' Code block height, width: (64 x 64)', + ' Wavelet transform: 5-3 reversible', + ' Precinct size: default, 2^15 x 2^15', + ' Code block context:', + ' Selective arithmetic coding bypass: ' + + 'False', + ' Reset context probabilities on ' + + 'coding pass boundaries: False', + ' Termination on each coding pass: False', + ' Vertically stripe causal context: ' + + 'False', + ' Predictable termination: False', + ' Segmentation symbols: False', + ' QCD marker segment @ (150, 19)', + ' Quantization style: no quantization, ' + + '2 guard bits', + ' Step size: [(0, 8), (0, 9), (0, 9), ' + + '(0, 10), (0, 9), (0, 9), (0, 10), (0, 9), (0, 9), ' + + '(0, 10), (0, 9), (0, 9), (0, 10), (0, 9), (0, 9), ' + + '(0, 10)]'] + self.expectedNemo = '\n'.join(lines) + + def tearDown(self): + # Restore stdout. + sys.stdout = self.stdout + + def test_jp2dump(self): + glymur.jp2dump(self.jp2file) + actual = sys.stdout.getvalue().strip() + self.assertEqual(actual, self.expectedNemo) + + def test_COC_segment(self): + j = glymur.Jp2k(self.jp2file) + codestream = j.get_codestream(header_only=False) + print(codestream.segment[5]) + actual = sys.stdout.getvalue().strip() + + lines = ['COC marker segment @ (183, 9)', + ' Associated component: 1', + ' Coding style for this component: ' + + 'Entropy coder, PARTITION = 0', + ' Coding style parameters:', + ' Number of resolutions: 6', + ' Code block height, width: (64 x 64)', + ' Wavelet transform: 5-3 reversible', + ' Code block context:', + ' Selective arithmetic coding bypass: False', + ' Reset context probabilities ' + + 'on coding pass boundaries: False', + ' Termination on each coding pass: False', + ' Vertically stripe causal context: False', + ' Predictable termination: False', + ' Segmentation symbols: False'] + + expected = '\n'.join(lines) + self.assertEqual(actual, expected) + + def test_COD_segment(self): + j = glymur.Jp2k(self.jp2file) + codestream = j.get_codestream() + print(codestream.segment[2]) + actual = sys.stdout.getvalue().strip() + + lines = ['COD marker segment @ (136, 12)', + ' Coding style:', + ' Entropy coder, without partitions', + ' SOP marker segments: False', + ' EPH marker segments: False', + ' Coding style parameters:', + ' Progression order: LRCP', + ' Number of layers: 3', + ' Multiple component transformation usage: ' + + 'reversible', + ' Number of resolutions: 6', + ' Code block height, width: (64 x 64)', + ' Wavelet transform: 5-3 reversible', + ' Precinct size: default, 2^15 x 2^15', + ' Code block context:', + ' Selective arithmetic coding bypass: False', + ' Reset context probabilities on coding ' + + 'pass boundaries: False', + ' Termination on each coding pass: False', + ' Vertically stripe causal context: False', + ' Predictable termination: False', + ' Segmentation symbols: False'] + + expected = '\n'.join(lines) + self.actual = actual + self.expected = expected + self.assertEqual(actual, expected) + + @unittest.skipIf(data_root is None, + "OPJ_DATA_ROOT environment variable not set") + def test_CRG(self): + filename = os.path.join(data_root, 'input/conformance/p0_03.j2k') + j = glymur.Jp2k(filename) + codestream = j.get_codestream() + print(codestream.segment[-5]) + actual = sys.stdout.getvalue().strip() + lines = ['CRG marker segment at (87, 6)', + ' Vertical, Horizontal offset: (0.50, 1.00)'] + expected = '\n'.join(lines) + self.assertEqual(actual, expected) + + @unittest.skipIf(data_root is None, + "OPJ_DATA_ROOT environment variable not set") + def test_RGN(self): + filename = os.path.join(data_root, 'input/conformance/p0_03.j2k') + j = glymur.Jp2k(filename) + codestream = j.get_codestream(header_only=False) + print(codestream.segment[12]) + actual = sys.stdout.getvalue().strip() + lines = ['RGN marker segment @ (310, 5)', + ' Associated component: 0', + ' ROI style: 0', + ' Parameter: 7'] + expected = '\n'.join(lines) + self.assertEqual(actual, expected) + + @unittest.skipIf(data_root is None, + "OPJ_DATA_ROOT environment variable not set") + def test_SOP(self): + filename = os.path.join(data_root, 'input/conformance/p0_03.j2k') + j = glymur.Jp2k(filename) + codestream = j.get_codestream(header_only=False) + print(codestream.segment[-2]) + actual = sys.stdout.getvalue().strip() + lines = ['SOP marker segment @ (12836, 4)', + ' Nsop: 15'] + expected = '\n'.join(lines) + self.assertEqual(actual, expected) + + @unittest.skipIf(data_root is None, + "OPJ_DATA_ROOT environment variable not set") + def test_CME(self): + # Test printing a CME or comment marker segment. + filename = os.path.join(data_root, 'input/conformance/p0_02.j2k') + j = glymur.Jp2k(filename) + codestream = j.get_codestream() + # 2nd to last segment in the main header + print(codestream.segment[-2]) + actual = sys.stdout.getvalue().strip() + lines = ['CME marker segment @ (85, 45)', + ' "Creator: AV-J2K (c) 2000,2001 Algo Vision"'] + expected = '\n'.join(lines) + self.assertEqual(actual, expected) + + def test_EOC_segment(self): + j = glymur.Jp2k(self.jp2file) + codestream = j.get_codestream(header_only=False) + print(codestream.segment[-1]) + actual = sys.stdout.getvalue().strip() + + lines = ['EOC marker segment @ (1133502, 0)'] + expected = '\n'.join(lines) + self.assertEqual(actual, expected) + + @unittest.skipIf(data_root is None, + "OPJ_DATA_ROOT environment variable not set") + def test_PLT_segment(self): + filename = os.path.join(data_root, 'input/conformance/p0_07.j2k') + j = glymur.Jp2k(filename) + codestream = j.get_codestream(header_only=False) + print(codestream.segment[49935]) + actual = sys.stdout.getvalue().strip() + + lines = ['PLT marker segment @ (7871146, 38)', + ' Index: 0', + ' Iplt: [9, 122, 19, 30, 27, 9, 41, 62, 18, 29, 261,' + + ' 55, 82, 299, 93, 941, 951, 687, 1729, 1443, 1008, 2168,' + + ' 2188, 2223]'] + expected = '\n'.join(lines) + self.assertEqual(actual, expected) + + @unittest.skipIf(data_root is None, + "OPJ_DATA_ROOT environment variable not set") + def test_POD_segment(self): + filename = os.path.join(data_root, 'input/conformance/p0_13.j2k') + j = glymur.Jp2k(filename) + codestream = j.get_codestream() + print(codestream.segment[8]) + actual = sys.stdout.getvalue().strip() + + lines = ['POD marker segment @ (878, 20)', + ' Progression change 0:', + ' Resolution index start: 0', + ' Component index start: 0', + ' Layer index end: 1', + ' Resolution index end: 33', + ' Component index end: 128', + ' Progression order: RLCP', + ' Progression change 1:', + ' Resolution index start: 0', + ' Component index start: 128', + ' Layer index end: 1', + ' Resolution index end: 33', + ' Component index end: 257', + ' Progression order: CPRL'] + + expected = '\n'.join(lines) + self.assertEqual(actual, expected) + + @unittest.skipIf(data_root is None, + "OPJ_DATA_ROOT environment variable not set") + def test_PPM_segment(self): + filename = os.path.join(data_root, 'input/conformance/p1_03.j2k') + j = glymur.Jp2k(filename) + codestream = j.get_codestream() + print(codestream.segment[9]) + actual = sys.stdout.getvalue().strip() + + lines = ['PPM marker segment @ (213, 43712)', + ' Index: 0', + ' Data: 43709 uninterpreted bytes'] + + expected = '\n'.join(lines) + self.assertEqual(actual, expected) + + @unittest.skipIf(data_root is None, + "OPJ_DATA_ROOT environment variable not set") + def test_PPT_segment(self): + filename = os.path.join(data_root, 'input/conformance/p1_06.j2k') + j = glymur.Jp2k(filename) + codestream = j.get_codestream(header_only=False) + print(codestream.segment[6]) + actual = sys.stdout.getvalue().strip() + + lines = ['PPT marker segment @ (155, 109)', + ' Index: 0', + ' Packet headers: 106 uninterpreted bytes'] + + expected = '\n'.join(lines) + self.assertEqual(actual, expected) + + def test_QCC_segment(self): + j = glymur.Jp2k(self.jp2file) + codestream = j.get_codestream(header_only=False) + print(codestream.segment[6]) + actual = sys.stdout.getvalue().strip() + + lines = ['QCC marker segment @ (194, 20)', + ' Associated Component: 1', + ' Quantization style: no quantization, 2 guard bits', + ' Step size: [(0, 8), (0, 9), (0, 9), (0, 10), (0, 9), ' + + '(0, 9), (0, 10), (0, 9), (0, 9), (0, 10), (0, 9), (0, 9), ' + + '(0, 10), (0, 9), (0, 9), (0, 10)]'] + + expected = '\n'.join(lines) + self.assertEqual(actual, expected) + + def test_QCD_segment_5x3_transform(self): + j = glymur.Jp2k(self.jp2file) + codestream = j.get_codestream() + print(codestream.segment[3]) + actual = sys.stdout.getvalue().strip() + + lines = ['QCD marker segment @ (150, 19)', + ' Quantization style: no quantization, 2 guard bits', + ' Step size: [(0, 8), (0, 9), (0, 9), (0, 10), (0, 9), ' + + '(0, 9), (0, 10), (0, 9), (0, 9), (0, 10), (0, 9), ' + + '(0, 9), (0, 10), (0, 9), (0, 9), (0, 10)]'] + + expected = '\n'.join(lines) + self.assertEqual(actual, expected) + + def test_SIZ_segment(self): + j = glymur.Jp2k(self.jp2file) + codestream = j.get_codestream() + print(codestream.segment[1]) + actual = sys.stdout.getvalue().strip() + + lines = ['SIZ marker segment @ (87, 47)', + ' Profile: 2', + ' Reference Grid Height, Width: (1456 x 2592)', + ' Vertical, Horizontal Reference Grid Offset: (0 x 0)', + ' Reference Tile Height, Width: (512 x 512)', + ' Vertical, Horizontal Reference Tile Offset: (0 x 0)', + ' Bitdepth: (8, 8, 8)', + ' Signed: (False, False, False)', + ' Vertical, Horizontal Subsampling: ' + + '((1, 1), (1, 1), (1, 1))'] + + expected = '\n'.join(lines) + self.assertEqual(actual, expected) + + def test_SOC_segment(self): + j = glymur.Jp2k(self.jp2file) + codestream = j.get_codestream() + print(codestream.segment[0]) + actual = sys.stdout.getvalue().strip() + + lines = ['SOC marker segment @ (85, 0)'] + expected = '\n'.join(lines) + self.assertEqual(actual, expected) + + def test_SOD_segment(self): + j = glymur.Jp2k(self.jp2file) + codestream = j.get_codestream(header_only=False) + print(codestream.segment[9]) + actual = sys.stdout.getvalue().strip() + + lines = ['SOD marker segment @ (249, 0)'] + expected = '\n'.join(lines) + self.assertEqual(actual, expected) + + def test_SOT_segment(self): + j = glymur.Jp2k(self.jp2file) + codestream = j.get_codestream(header_only=False) + print(codestream.segment[4]) + actual = sys.stdout.getvalue().strip() + + lines = ['SOT marker segment @ (171, 10)', + ' Tile part index: 0', + ' Tile part length: 78629', + ' Tile part instance: 0', + ' Number of tile parts: 1'] + + expected = '\n'.join(lines) + self.assertEqual(actual, expected) + + @unittest.skipIf(data_root is None, + "OPJ_DATA_ROOT environment variable not set") + def test_TLM_segment(self): + filename = os.path.join(data_root, 'input/conformance/p0_15.j2k') + j = glymur.Jp2k(filename) + codestream = j.get_codestream() + print(codestream.segment[10]) + actual = sys.stdout.getvalue().strip() + + lines = ['TLM marker segment @ (268, 28)', + ' Index: 0', + ' Tile number: (0, 1, 2, 3)', + ' Length: (4267, 2117, 4080, 2081)'] + + expected = '\n'.join(lines) + self.assertEqual(actual, expected) + + def test_entire_file(self): + j = glymur.Jp2k(self.jp2file) + print(j) + actual = sys.stdout.getvalue().strip() + self.assertEqual(actual, self.expectedNemo) + + def test_codestream(self): + j = glymur.Jp2k(self.jp2file) + print(j.get_codestream()) + actual = sys.stdout.getvalue().strip() + + lst = ['Codestream:', + ' SOC marker segment @ (85, 0)', + ' SIZ marker segment @ (87, 47)', + ' Profile: 2', + ' Reference Grid Height, Width: (1456 x 2592)', + ' Vertical, Horizontal Reference Grid Offset: (0 x 0)', + ' Reference Tile Height, Width: (512 x 512)', + ' Vertical, Horizontal Reference Tile Offset: (0 x 0)', + ' Bitdepth: (8, 8, 8)', + ' Signed: (False, False, False)', + ' Vertical, Horizontal Subsampling: ' + + '((1, 1), (1, 1), (1, 1))', + ' COD marker segment @ (136, 12)', + ' Coding style:', + ' Entropy coder, without partitions', + ' SOP marker segments: False', + ' EPH marker segments: False', + ' Coding style parameters:', + ' Progression order: LRCP', + ' Number of layers: 3', + ' Multiple component transformation usage: ' + + 'reversible', + ' Number of resolutions: 6', + ' Code block height, width: (64 x 64)', + ' Wavelet transform: 5-3 reversible', + ' Precinct size: default, 2^15 x 2^15', + ' Code block context:', + ' Selective arithmetic coding bypass: False', + ' Reset context probabilities on ' + + 'coding pass boundaries: False', + ' Termination on each coding pass: False', + ' Vertically stripe causal context: False', + ' Predictable termination: False', + ' Segmentation symbols: False', + ' QCD marker segment @ (150, 19)', + ' Quantization style: no quantization, ' + + '2 guard bits', + ' Step size: [(0, 8), (0, 9), (0, 9), ' + + '(0, 10), (0, 9), (0, 9), (0, 10), (0, 9), (0, 9), ' + + '(0, 10), (0, 9), (0, 9), (0, 10), (0, 9), (0, 9), ' + + '(0, 10)]'] + expected = '\n'.join(lst) + self.assertEqual(actual, expected) + + @unittest.skipIf(data_root is None, + "OPJ_DATA_ROOT environment variable not set") + def test_xml(self): + filename = os.path.join(data_root, 'input/conformance/file1.jp2') + j = glymur.Jp2k(filename) + print(j.box[2]) + actual = sys.stdout.getvalue().strip() + + lines = ['XML Box (xml ) @ (36, 439)', + ' ', + + ' ', + ' ' + + '2001-11-01T13:45:00.000-06:00' + + '', + + ' ' + + 'Professional 120 Image' + + '', + + ' ', + ' '] + expected = '\n'.join(lines) + self.assertEqual(actual, expected) + + @unittest.skipIf(data_root is None, + "OPJ_DATA_ROOT environment variable not set") + def test_component_definition(self): + filename = os.path.join(data_root, 'input/conformance/file2.jp2') + j = glymur.Jp2k(filename) + print(j.box[2].box[2]) + actual = sys.stdout.getvalue().strip() + lines = ['Component Definition Box (cdef) @ (81, 28)', + ' Component 0 (color) ==> (3)', + ' Component 1 (color) ==> (2)', + ' Component 2 (color) ==> (1)'] + expected = '\n'.join(lines) + self.assertEqual(actual, expected) + + @unittest.skipIf(data_root is None, + "OPJ_DATA_ROOT environment variable not set") + def test_component_mapping(self): + filename = os.path.join(data_root, 'input/conformance/file9.jp2') + j = glymur.Jp2k(filename) + print(j.box[2].box[2]) + actual = sys.stdout.getvalue().strip() + lines = ['Component Mapping Box (cmap) @ (848, 20)', + ' Component 0 ==> palette column 0', + ' Component 0 ==> palette column 1', + ' Component 0 ==> palette column 2'] + expected = '\n'.join(lines) + self.assertEqual(actual, expected) + + @unittest.skipIf(data_root is None, + "OPJ_DATA_ROOT environment variable not set") + def test_palette(self): + filename = os.path.join(data_root, 'input/conformance/file9.jp2') + j = glymur.Jp2k(filename) + print(j.box[2].box[1]) + actual = sys.stdout.getvalue().strip() + lines = ['Palette Box (pclr) @ (66, 782)', + ' Size: (256 x 3)'] + expected = '\n'.join(lines) + self.assertEqual(actual, expected) + + @unittest.skipIf(data_root is None, + "OPJ_DATA_ROOT environment variable not set") + def test_palette(self): + filename = os.path.join(data_root, 'input/conformance/file7.jp2') + j = glymur.Jp2k(filename) + print(j.box[2]) + actual = sys.stdout.getvalue().strip() + lines = ['Reader Requirements Box (rreq) @ (44, 24)', + ' Standard Features:', + ' Feature 005: ' + + 'Unrestricted JPEG 2000 Part 1 codestream, ' + + 'ITU-T Rec. T.800 | ISO/IEC 15444-1', + ' Feature 060: e-sRGB enumerated colorspace', + + ' Feature 043: ' + + '(Deprecated) ' + + 'compositing layer uses restricted ICC profile', + + ' Vendor Features:'] + expected = '\n'.join(lines) + self.assertEqual(actual, expected) + + @unittest.skipIf(data_root is None, + "OPJ_DATA_ROOT environment variable not set") + def test_CRG(self): + filename = os.path.join(data_root, 'input/conformance/p0_03.j2k') + j = glymur.Jp2k(filename) + codestream = j.get_codestream() + print(codestream.segment[6]) + actual = sys.stdout.getvalue().strip() + lines = ['CRG marker segment @ (87, 6)', + ' Vertical, Horizontal offset: (0.50, 1.00)'] + expected = '\n'.join(lines) + self.assertEqual(actual, expected) + + @unittest.skipIf(data_root is None, + "OPJ_DATA_ROOT environment variable not set") + def test_differing_subsamples(self): + # Issue 86. + filename = os.path.join(data_root, 'input/conformance/p0_05.j2k') + j = glymur.Jp2k(filename) + codestream = j.get_codestream() + print(codestream.segment[1]) + actual = sys.stdout.getvalue().strip() + lines = ['SIZ marker segment @ (2, 50)', + ' Profile: 0', + ' Reference Grid Height, Width: (1024 x 1024)', + ' Vertical, Horizontal Reference Grid Offset: (0 x 0)', + ' Reference Tile Height, Width: (1024 x 1024)', + ' Vertical, Horizontal Reference Tile Offset: (0 x 0)', + ' Bitdepth: (8, 8, 8, 8)', + ' Signed: (False, False, False, False)', + ' Vertical, Horizontal Subsampling: ' + + '((1, 1), (1, 1), (2, 2), (2, 2))'] + expected = '\n'.join(lines) + self.assertEqual(actual, expected) + + @unittest.skipIf(data_root is None, + "OPJ_DATA_ROOT environment variable not set") + def test_palette_box(self): + # Verify that palette (pclr) boxes are printed without error. + filename = os.path.join(data_root, 'input/conformance/file9.jp2') + j = glymur.Jp2k(filename) + print(j.box[2].box[1]) + actual = sys.stdout.getvalue().strip() + lines = ['Palette Box (pclr) @ (66, 782)', + ' Size: (256 x 3)'] + expected = '\n'.join(lines) + self.assertEqual(actual, expected) + + def test_asoc_label_box(self): + # Construct a fake file with an asoc and a label box, as + # OpenJPEG doesn't have such a file. + data = glymur.Jp2k(self.jp2file).read(reduce=3) + with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile: + j = glymur.Jp2k(tfile.name, 'wb') + j.write(data) + + with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile2: + + # Offset of the codestream is where we start. + buffer = tfile.read(77) + tfile2.write(buffer) + + # read the rest of the file, it's the codestream. + codestream = tfile.read() + + # Write the asoc superbox. + # Length = 36, id is 'asoc'. + buffer = struct.pack('>I4s', int(56), b'asoc') + tfile2.write(buffer) + + # Write the contained label box + buffer = struct.pack('>I4s', int(13), b'lbl ') + tfile2.write(buffer) + tfile2.write('label'.encode()) + + # Write the xml box + # Length = 36, id is 'xml '. + buffer = struct.pack('>I4s', int(35), b'xml ') + tfile2.write(buffer) + + buffer = 'this is a test' + buffer = buffer.encode() + tfile2.write(buffer) + + # Now append the codestream. + tfile2.write(codestream) + + jasoc = glymur.Jp2k(tfile2.name) + print(jasoc.box[3]) + actual = sys.stdout.getvalue().strip() + lines = ['Association Box (asoc) @ (77, 56)', + ' Label Box (lbl ) @ (85, 13)', + ' Label: label', + ' XML Box (xml ) @ (98, 35)', + ' this is a test'] + expected = '\n'.join(lines) + self.assertEqual(actual, expected) + + def test_less_common_boxes(self): + with tempfile.NamedTemporaryFile(suffix='.jp2') as tfile: + with open(self.jp2file, 'rb') as ifile: + # Everything up until the jp2c box. + buffer = ifile.read(77) + tfile.write(buffer) + + # Write the UINF superbox + # Length = 50, id is uinf. + buffer = struct.pack('>I4s', int(50), b'uinf') + tfile.write(buffer) + + # Write the ULST box. + # Length is 26, 1 UUID, hard code that UUID as zeros. + buffer = struct.pack('>I4sHIIII', int(26), b'ulst', int(1), + int(0), int(0), int(0), int(0)) + tfile.write(buffer) + + # Write the URL box. + # Length is 16, version is one byte, flag is 3 bytes, url + # is the rest. + buffer = struct.pack('>I4sBBBB', + int(16), b'url ', + int(0), int(0), int(0), int(0)) + tfile.write(buffer) + buffer = struct.pack('>ssss', b'a', b'b', b'c', b'd') + tfile.write(buffer) + + # Start the resolution superbox. + buffer = struct.pack('>I4s', int(44), b'res ') + tfile.write(buffer) + + # Write the capture resolution box. + buffer = struct.pack('>I4sHHHHBB', + int(18), b'resc', + int(1), int(1), int(1), int(1), + int(0), int(1)) + tfile.write(buffer) + + # Write the display resolution box. + buffer = struct.pack('>I4sHHHHBB', + int(18), b'resd', + int(1), int(1), int(1), int(1), + int(1), int(0)) + tfile.write(buffer) + + # Get the rest of the input file. + buffer = ifile.read() + tfile.write(buffer) + tfile.flush() + + jp2k = glymur.Jp2k(tfile.name) + print(jp2k.box[3]) + print(jp2k.box[4]) + actual = sys.stdout.getvalue().strip() + lines = ['UUIDInfo Box (uinf) @ (77, 50)', + ' UUID List Box (ulst) @ (85, 26)', + ' UUID[0]: 00000000-0000-0000-0000-000000000000', + ' Data Entry URL Box (url ) @ (111, 16)', + ' Version: 0', + ' Flag: 0 0 0', + ' URL: "abcd"', + 'Resolution Box (res ) @ (127, 44)', + ' Capture Resolution Box (resc) @ (135, 18)', + ' VCR: 1.0', + ' HCR: 10.0', + ' Display Resolution Box (resd) @ (153, 18)', + ' VDR: 10.0', + ' HDR: 1.0'] + + expected = '\n'.join(lines) + self.assertEqual(actual, expected) + + @unittest.skipIf(data_root is None, + "OPJ_DATA_ROOT environment variable not set") + def test_jpx_approximation_with_icc_profile(self): + # ICC profiles may be used in JP2, but the approximation field should + # be zero unless we have jpx. This file does both. + filename = os.path.join(data_root, 'input/nonregression/text_GBR.jp2') + j = glymur.Jp2k(filename) + + print(j.box[3].box[1]) + actual = sys.stdout.getvalue().strip() + lines = ['Colour Specification Box (colr) @ (179, 1339)', + ' Method: any ICC profile', + ' Precedence: 2', + ' Approximation: accurately represents ' + + 'correct colorspace definition', + ' ICC Profile: 1328 bytes'] + + expected = '\n'.join(lines) + self.assertEqual(actual, expected) + + @unittest.skipIf(data_root is None, + "OPJ_DATA_ROOT environment variable not set") + def test_uuid(self): + # UUID box + filename = os.path.join(data_root, 'input/nonregression/text_GBR.jp2') + j = glymur.Jp2k(filename) + + print(j.box[4]) + actual = sys.stdout.getvalue().strip() + lines = ['UUID Box (uuid) @ (1544, 25)', + ' UUID: 3a0d0218-0ae9-4115-b376-4bca41ce0e71', + ' UUID Data: 1 bytes'] + + expected = '\n'.join(lines) + self.assertEqual(actual, expected) + +if __name__ == "__main__": + unittest.main() diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..b2b693f --- /dev/null +++ b/setup.py @@ -0,0 +1,28 @@ +from distutils.core import setup + +kwargs = {'name': 'glymur', + 'version': '0.1.0', + 'description': 'Tools for manipulating JPEG2000 files', + 'long_description': open('README').read(), + 'author': 'John Evans', + 'author_email': 'johnevans938 at gmail dot com', + 'url': 'https://bitbucket.org/johnevans007/jptools', + 'packages': ['glymur', 'glymur.test', 'glymur.lib', + 'glymur.lib.test'], + 'package_data': {'glymur': ['data/*.jp2']}, + 'scripts': ['bin/jp2dump'], + 'license': 'LICENSE.txt', + 'platforms': ['darwin']} +clssfrs = ["Programming Language :: Python", + "Programming Language :: Python :: 3.2", + "Programming Language :: Python :: 3.3", + "Programming Language :: Python :: Implementation :: CPython", + "License :: OSI Approved :: MIT License", + "Development Status :: 1 - Alpha", + "Operating System :: MacOS", + "Operating System :: POSIX :: Linux", + "Intended Audience :: Scientific/Research", + "Intended Audience :: Information Technology", + "Topic :: Software Development :: Libraries :: Python Modules"] +kwargs['classifiers'] = clssfrs +setup(**kwargs)

mO7M$AhuZeZt)#Ybq8 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�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 r4EU9T4!Lq7PsH{I`_?p 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 z zLhlk!WZ9yNqHOyFOz8bktp8CrM89e8A_Y-;(8!;}Po!+e2j&wX`Hn7IF zyfOrk`xo%3FMrZ#ZI1yBE==cQ(kriSts+=$D7!u?D;`WI&k8o>?0G zS28#k<*SB^;2$W}gQ`Ji>cRhMQM|t_I-elz^J zFQ)VHMdEdPQvWLwhAaL(glZGC5JdqWN0d10?&+!8w2W!pwvnJtR%fqRzdov7CZb+; zKr)1pO08Qa06?~b@ou<_!S(hDdOTWIVVjaZ=27oJ!b0vx7~S%VOq=;Yra)S{7E13pbfwD)*>NWJ5csz9DFjs*Qr4jk zXBFKS-FJI5dT3CHhz_{9|0tH5ERHivsO4Z#Gn+9qd&u-KY{Y6cPnAa4T<*4gR{MwIm)LtrmMqHQ4|Lrlep_FH z(pqKO@DhX$u?6vy0@vlX$*WOQtti4k2sSt#yL;8XpXDIQxG z!PdNW-<>h(AAFQ~Ct~ERt*rsaoIg|oNN2LXh6(7Pg&x|<;lJiOhnmm?VCTj0L96#x zZQB=FJp*sl<#IsHEDkC0dkY{Ad6|QH1<};Mz5GPXKB6^Muje3X!|I>qDo-hr zZH7kjvmwFpeQRL&zO4{G52i4kg~I&(H|FN?ovP~v8I~eC9WThW+JAb6f<1P zx$revdL;Tpg$R~5QjV7_8;M57AW>)MDlFqubnBy#uk2-;zmdIn*`e?Q#UKwF`4WS1 zX_a1{Fup72 z$ZYAJui8)A(_^*(G$P!P{`#7gV?_>_kR~46DadfN=4>||)7jW9sg+DBf^QfRrMDhDcdK;of z$9Uew<>TFEzzlCxoMuk4dJ21yEVP9J&4kg9s^LSP!Pbc?EOV4>;TJ}z->iR)$kIR| z7gX7o0Iy}bxjFJ!a#|iwIZoau=CI-<<}u2$-Z@o7>Gf(xM}q)Jf>K`gj9P32Rn=Uk z$d^o{GxD|#EK9QN=Gn6lCEl^Dj7Bh@SJ*X>BS6Vg!)s)3l;A611go`x$?t$Q=f+T! z5lcc)QgMzgjxolWD)!vpU|lUN1gB>C0NcoJ6CO7b0dk?n^%;;5Tf=d;7fbrnJM!d3 zfKb!w87CS$d?(`}j>pNUdC8~u(|!6yt!z|O`Juie*N8=FaKIa%TNPz?Jrx`1K@S!; z4KV`X4gm&$G|i|vOMYSPasiyk*Te8l^%bSifjad_<~KXr0)jb3;&s2O+~qEL3;9GH zH`{SN*3o*E{&G~$NBV}xWT0wFZ4Oq(f?|H2CF`kC#9=c2ox5vr1RVxq!yz`P(#g7vd<* z63Z+$%q>ow)LF)q2te$pE_TE^YXwMtlH{nd`)H!e#b?uk>dpeQQSy|nSN-_FT`7mA!!s)$YhS1hf+uCPH7R<% zRIVvzE`Mks_M*GcuS^>mkD;^nt^UJ8cQ zg zczbVNO~O=PUb!hNs#l))>0L1XCd8Z4_&q9TVkfMb zQp`@{Hn*Z~F%E+oCc!tt(8(=LiV5ZRkseW8N`TR;Z=Mx!mV$Ea&+Q_nx2O(&D@Ju> zXt5DzDVMp=hHWw@Ra4}+vZ*OwDu^ZJ7%A|8ns?}!!Ppv3*ShOE3F`S+|7kI;(5++W ztG>$}j8xBy*~!VqHsACA1$){n8B=gLFpbvNtLm8bfbftKbODSLdHsz+^C~T6>%zxn zcCq*auOoaN3?fEC&sL9?6>qMypt9+6B%rpWUS5a4I!hK96w}wWg!zADd-j3VqnC{A zJjothbOZ^d_vwoMt{rfTze^$|CaA~9`;(`Ec-QlYWl=(Mc1vo1Dcfs` z71i*HbqfIhL!6Pwo!H0qE!~i@)ibKFEFd0MX@5#*=Tt-5%6E2`qDdibB}HM+!^Thu zLxjyqF-DVNcW@%UUL8O%xu9S6TC3VJS{g{==m4h8*B?_DH4B-9R7g$L$sCd%#313va5^-4({N-Stzy{pZmi$d$@HRH{8GoD=|xYtrP%hQowaWivr=!Yie$MMKOEFhWb^~fEeBzyYj z>t$ZED|Q$tX=&k|hl)cpT?kjpf>or#*_@nGEDv~UoksQHs&yI96S*V~0F3QV2V~cy z{x{3yw>6Sa)$D3rp}O~~z>QDSa7zj0~fP=sOWTJNJRkGB5}PacQ(oqV_J~L{}E>at_eA6 ze-Lt&@VKw;5{h`lBo9klXtX`D7`-TxsXup{feY-zx_9k(krL8Ysj#tB`F&C zaZ9Q{Av!z$$F+_xUrLOtycDB%cfC#TGnW;2GfcV0P!Rl3UTX+M37<4EEwR)iIq4g^3UftS#u5sO?_pzC;`j4h zzbXtCs2Xieo=E*5X>BY2G5C|s*+$c!{vRt7Aj&8U%F-7^S_RUi#XXd%&zp|X^%*|@ zZf!x%+&XqkoO)zal)dADi{YbKEmy(MUkLYHgCO?2@R(WEL$`D- zgY2rdPx|V$t$P{8x}fm&#TEI z-G~_hopCS_vXdZIYU}>**K3MgpAI<%a`jgwV$7*MNGrEv)YrN^b!iTHpI2Ub#Wup? zx{;`msxKolgjCpv>AJ?PEF_Srn-I?eGgje_din6mi{zhW*ApXtXo*CSC$)g+mvN)e zS$5M_=m0EDAn4aab4muJQHr^Ls+ecnrS*~ZF8=4tBkrjAI5wCHFv242Qul*M{jPs28V)(t2OwYc=H8urcve@5ohiT%OuuQv<@+1K@qLb<`96Zc^jXTtug%p(L z9hz^o^YGpZ!8A#=cW@kUdL6tM3}g%3o)Gs@0lb5)Oc}raiVw)r3^xVnQF1Zle_qm9 zbL8TtOByoTp))=NL=ilax!%)${5!S}^yi0v=Lb;Svt(Y>?Vzh5o&R1@ZSDOx`98i} zEiL%2;Zf5I%qsoNuevWYMd=EJgEW&EA}V8P;#6Nx=(wWr<#{A%0ltC(f$G+2S`ln} ze0rOtx7p$^Clb5}eLe*W457v=7~dEzz*hS28Abq?=NX(|8g>WY=<#*Cm*dXHTVe`SL;kk6Iu%RIjwdMS}qi~E*@a$+%| zTpf3ZO&&^fWE{_jQ$J9vUJTE3NzQMkiDj=ZF$x=SF|y?w`Ti_!XXJ?bf^}XUg^3WA z^Uzp%ZcuVfkYAkhxS{>uY%$mv@MTcb=E6$z!UJ4xpLH*o0FgBdfBa2!j|UJYos+8sePU^J`-SoGVdT7-tRlhS3K+VPrbP^)V3_Y~l85yrfU!1E5O=^i?W zSkD&=BQ;hgfzy(5#wEJZKs*rWPi&cUTyy#I0A(Eqq;3W%r56Im(TDhfli(RFE;ucv z%Q`Ns{QIv%PV5WMrs2CyLMhgDfXh}FRJ>oYjADU5lC=x3537o3`lG&G>Vx4znZmmG zcns@IgJV zeHGZ*gmD3Nk_=8Z>bRDWn@kG%lcVsnbv@7~e7DH7hB9SPd+vuFP(uJK=9 zeZ_jNyo^0m6|W`8ysiwRS-2_hd-78E+9iV_N1kG2x83tM01~KV(#)U*&e1Oian9pGa5GxnGi@ny%Iq1G=n3duH|gEn z<~JPu0a?&6l3QLbx#LG**aXw-TR8KFK%$+b|02UO%vT$qc_3Ut&Ho;OzyZCJ8;e@m zJDCC7x9Wby;sQT!uoTrEY(#DkyG_|%A#PJchYBEcCkpW}^8JliC{#=9K~ODlm!%E2 zM6D$WyUPNQ)a(Fj@h^OxQ=iJ1uJ1$PfWk$;b|%N?{6p&;TwrkEJ*I%RvDT~t7^==V zB$&dKbQPm^gd=8Y`7Qm)p7H4-2>4&V1Q`j2;QqO2|5CM`tS6SDB&U~z|8{m#P)UJ; z0+|ifVu8v9gvi|=u*A{+F>lo=JMf17i3sg2;B3~=qb}LqRm2~~7%LINJGFdv&ceVuN=Y(1pJG@kWtdtoT2YLc zbDw78svM9qVzLXhzbXL;+gIIy!ePv`+r1o;9nv_w$F7?R?J@R#sCkO}3vsD{#*T=V zt01L@Bc=X3=b5`qqRM(^lC67cq8r)WG*)_bjEfWG@jtFCj6xc~tg*HN{|{@RjC~`n zf5`AvNhAsY@PJQHfP^Uw6IK-P*O|Sz*L~D0{7~&T66g}W5>dY&<)uXlb@2McSAXi{ z<8yDV@z=5z9s7VEQ()4T1$E#{&lm|EXrtf~|kKDS+A z{IH)q#S6Ee=#{N7H6nk&$hxxa)#Ef@Bl9BIk)I5JTola-m#=vp6(_d?(dL3Q**nQ1 z(#gS>{<2ReNm|Kha@IG5fja0M><@ZKLQw6hkoz6X+HhF_A;3^?cPgq+d91ynh!9tf z9!qr$bsFo;@#y6>C$XIhEaMfWVk`*FNvvRoxr}jHOi~3$#<#F`P$WTa+a2MpK8)Do ztdzEJB6~+^2okbnK+*YB9E_GqF~-F8`GI*z?@VLi0%mL3%WxyDR*<@`Mg|=!!>BhI z(-sG_sbXQUmIEcxWj|>nRU`;&a6k}S40cMlje2sUSQ`ql9e`e5D7&cQsQ}SEq z$}s8|pX3o9tI`PDH+SL86o+o_I*^%MEm=$&IuVkKx16$565_Thw=1c<{m!*WxrRu- zashtJ5o-=dPuoI-2(9SUO^|xd9_b`x(l?GOP)mrX{KBwIUnVLvLrT~kD?Z`6ZME5w zS1t6vGSMQbiu$BqsEf}<%?;&GuNL2?0b5$Uyh<8eS^GGS-v^Y|ec2q2GrJlMi&8gM z-Np4bt^ZhVM7$nop8(<3Eh$0q0B*`;aMdj<9<WJKZG}V)y0| zI8Em08F3e0NF4xTO0IKN)x7{TbhITlijT(UMOVEl0bRUN*wF6uF<)piOhmfy0K34v$`e#JTfaoXUBHdU7>>LsZ8=!JJFA1z#{sA=zYVMqA;7@-R-S%Q!!rv-X3$LtWoz@WPW^LyZ5L7c?d2wE!p z#X)yPhqr12c-lwX$a-I09Lf5KElAJpLKPCSyqi4OS~nBiUhqARvmk$Bk+h&`bXO>* zlJiiQLf@+z#inXm#VfyjL?BiqIkKNc|5O;2P+;Ds3bGPVcHN|k#Fvfge*v) z4}Z5c@A_`jee-bJo|TUg+G-?4%cU;g;BLRXHD-g(?3$#GVqXS( z4#FDDHYG$|N1yehCB;@=hw%&t$;k=GoaIB8Cjt1KnhCxG^|13>x!*v{_Cy+R$tVrmCxcf`7y4p(58cxqJ z81|h!+)(mPFZa@es(U1&ji=y?6pqdg?k05t*u~L8+sDFv*#WZ**|50VBl5YO#nuKp z{p|Hz0i|wd=X7o#xh@cUe~RYc>D05;xg=%D(iP+m5cp0}X(dp_p$g({Ez+o$uQ?@M zE+mM9IdAqMrX?cwv-?pQuJi6!{^U(0D-iI!>WbSO)5C|4(K*3hXPy_?}-X<4C3LMPFzE}T zP&1no?|k(ELL_KuerW{N_<+& z;ceXSRegXX2qR ze{duCoEJ?cgLg!B1JTkqR-g|(ZRHH}I|=k44vf;}ArDu`Z@xyAPZ z`ra61)d2lIF0di4q~6=I(^8+DsJy?9W+QE3fDZycI857Rw4ELQ8sZy9>-?&p}RGpwJ77`eGE zma!X&Az7WDer?s@K61L{^nQik+3)pzA9Y*l`=sUceegeTzm@d%T3;m9*WTW{b4x&;<|>0~I#WqIOv{L-WaBHB~9@f}306nXiGb5^g5 zpz-W((uS?GDx;wiC5~?y4WJG9#0;2ixGr`q_SWOwdJGa7lm2R$fJUTxIh4WkJwHfg zC|(e$R{8ff?yO_?CyNv1)}~(Fp6Yl}A`kb*+}a|DDok_CX^XNNdRl$8lmlp&iQh115rFeuReB(P$~aSIF=y$e7!)0((! zV)1T6KKvFbe{fp7OR$Ix%;b7vS=Tfg(6A}OuADf*$sf5(H5%H^kJV>Vp#~@x~1+ibY@5z(%>(&J++dVpOK?SuJy6%qv=WQ z<|p^%VZ0#B^yAr&kKk*m%A%9y<)M#jDu`y~|2zy%LG!2}|4F6jdxbH}!BJ_W$@{{% zH|vn87AV)7egaciM}Yt*t2rk0ysfrM&GDG9yV!s{fZoQ>Bq=5V-bkjVENgDBRB5H{m8fuPxZ3|VQ!+%M4bvWd zmVut45WrTvA(hGkipcEa$8WJ>GA0ze$+5t-R5c|V zxIt4uyCZw}#!sEnd0g=|Vdq#S%Ano18tyeKJFnI1!8|-UHn>Y->-|VB!uDK`&w?q> zT!h6)xgUALH^7^Fhz{{JY+;>jNyYNG!FEy^NxQ7hs`e(4ulebpD|NW2;c)nmI;sc$ zRQrzMV+LjpDi|L2aAiNyYS$TDq$RyYrunjj2*imMfo=<(82N5T4|(|gIEYl_=7 z%W~=-03Sw2htb>V2e9OlN>*EWH0wuRDsUsoKy|t89E$wxc53<7RAv}Z(C3r6<7esC*wX|L0 z;fO58?d!u)22KjgSv&ntagp_MZKo+OWL2c<@t0thS}xI)*LbARD~b+mU~EQ^ZNU|c zj$YnM6dE%OF~gLn*mk=&>r!ygf@4|TM?~(_O#Xr!s!3aYV_{pcrekVd+k2S?teH%B zvFGNs8N=62R`F4qSnc#B<^_~&9IrC1(Stp7aQnr)@Pk>XFz9jkb8Wy|^VGlt^Tj381a1&`iyukCK`FT zWsQhBmsjyh*-L!(aXvL<{JQuJ2CPQB?(ygap`r)d9-$e7HPWColG%0u=j01;v_ocR zYDw@}Vzt-zv1HOGj~B&^x+L3C=(7J#l;6-&=mFLLPl`K!CyWMw|8~8dFXTt~3qSlo zFs{3j-#Fi__BQPxB?ei(-g9K;EDWBh3mU3$y^3s0;2Qp25L6Sr z|0c7!uC-XD+!}>OUuekWbjb~@EcFRK3&DMfYp%@v&f`cC-gjzAP~KUGcsUj9RuMs@0zgIqq$gC?-b35hso?G)NF7Ir2mFRxd_gI!|{_G{NorkF0xN`zi^<)Btj0mX8@ z-Yy&=fq;e6GR#V_dGVD!VkZ-s;m|38otN9=m+e9A!Q*u+ zp1gV6{r6xRGKy86 z0oRUs;p6mz$o;jI7$n*X?ALtLz`ILQRPSP!rABq;`b3;#W(gGU#)9lNJB478Zywci zgtQ`7pPVyZ`lC(Kq-|DE%-H(jG&uV&bcc-R%;bPP_{ErXY-K#U!rq}(2pD(!b?i!s zm;_PSB;bU zgkqoj@x?QU*J#%rC_OV(9TgyQj~R)ME&l-wH5*RT#CKfxCpQFH!@^(tTY#A!JDsfO<*_|f|@zIMwXpZ#^0dz$*SBOMh~p?&#oz6QLXTJ+|}0E*yjQC z#C#O8EWpnlml6D(_)j4`z&05JoSK^UB-;QmeGw$wqZzsr5f~$T))~727P33#Pq(Om z$2Y~~aWk5g2v(wx=Y6Y=7~IPmdWD++wGRfl&aD2w&EL5n>+o+#Iyf=Agu6Lt)P+j| z%>`ab@OML+J7f*`wbe~$Z1$6i>Ar=lEnp3)bJK=v~m6ZE)d+*Q3jxrHOf zABjy9PN#1fCBFulKt=HCPrFRP2lgm(M0yw##7F!sd^Bdir}=r+4K#F2uJrid`C zTWKC!#5&Efai`k~|AY#i-O(dENayij-EN({8}Gw*_>>lyh0;h*|MRW9OuBipU} zxUH|D-j z8o-i$Q-oGbOsQ#lEuB(m*_EJ_Sfz^$$}C`ByF`og8nBT6=9{ORMUngDO53w0 z-mYEVH0^qxlUVH<-&Z5GNL96Nv^O39)~OpopG~Q$gZNGrN@1xAtl7B3-^%xGIXrf2HAGiI&GwYp*S@_E`^5_ zLPy%xER1Syw#LlZ5&6~au~RkyID#_bEt0g{#Bd~{w#Psg*hkIklhu#j@CLsU?Ptv8 z-jv1iz7e4Dh*>DxNXCE+^RG(^_a2u4;TL=8xImy-xrla0A6UH$s{|x+DP#%h$rSj? zLJe(e48@L^5Xm6zG+{=P;vAvxF;TQ!#->O}Ps$ci5seY+5-~u)rV{ALPBi>DP+LV4 zqE>G$zb~-%ZA^wgjguJP(o^raFhS2RO$m*=0yPN+>|F)97wjD1YQLNg9JXm)k&985 zYBi#)88V%d>VEkud&KlCboD&z(R@5(-suZ0U=Oc2f6z!e8uRlq4T*OMOqch)URk#= zHt{;s*nq3F5|*FFkydA_J>fFr#;gH|!jooB6ayMdeXB9mlL-~?#SK1G@vLvcck7@I|z zO%w&$bcc8$wDYY_kd#_MXD~pFbRlSfZD=S2-ii<8V-y<`akM4{UTKq8 zAZ!a{D_puk_`hhi>NZe>y^1qjC;?t zz0EGn?kj86Mf+trcA5(5jEdPKoU2RCh+ORB>J$c*!W}Y}$yI$%uXfczk)I>QJ7=YsriqUYbYea|+^y(c zv{jd(P)*EcwD$0Rh8?5|eGPjJJa9HgN>|y4?hPEkUe)jJcqDu_Sg_;zq)m>*H7LF8pA*x~<4<=xFQ7j;2@~)7<%E0 z8&MOs(mEoA$YxXH&52A!5c^{vNTO0G=JZy0vbbLLGOq zIhaTcH?Wd(PqR)5aA-2OO{{)yW1j1>KK~St$b1~suHQ3H_W7YIm)eJ-$BeE=p_loe zMLx7Ka&Xs(VI}BOsCxG8V_FD4;M(oZ1BqORwJ&tLdn!xP<)KCTt`3Bdh8$=AY$nE6 z%7G$3{Pr@_koL{z0aq#xT$b?HN9{Fo)?q_mKYbsY^dKyqcy;XkuxRP-iU?_%0#gb9#iu+rZpF zuM9i@XupwG&u6nRNOKHE4PC1TYdSH0R#5AJblg?%2H^BuD>-g0a+y)a)&E-W9={IM zQ}k>vYKVD*`I(f-csll~dqM0V|7@)4e`FGGQe({0?J7Ud?y!-3(OB&TB5R_@3H6oY z^b2M?UcP!-qh7_^pn}P^vST|qu9~yKf6SHu7xee!HZHAWJVb-BNiG>tCwGdAM-ZVs z6GyV0hNeca%?lk-m`ZsuDRaEFe!+9sY);A}vW$(VH<8p@-ed({Rp}5$?_S2&mjqjt zngu*2CmAp*d@%w%~lLE_D!_se5bNJqnBn z1s%qA)&6Wi&TS+Wwo6h@Z3-_%x{g&BgyMbkb}ugmM@M@Xe4Une#d>Zskna#90yEKG z=rN;p;CVFQz8YbXeVUb8cqP}1<7>8x%_vDyAadz|*(_+gK$de%-=<^P$+A9~M99D0 z2%*svE9()$IU8=Z^j8^W5Mh&AN-;wP|8SM=8Wi_ACP#ZLUej^KnYXS=mBVIv*$~vg zPh;FgY9|uXvV2eUeF4hWBJ6w?Re$iugOBTcl^mm}5!LaC`2u)d9=Sc@jFfSV`T%4!FlcR^O;a44N z!9hqL#BC;&8u8CD{#M83o}ht#lO=0DG(-Mh6sjZqy)WX;Oo$-2<8#<~M3KBhrO#aKG@XPitcHlp*yIBqB8WNBO4Hoc$Gse4BuQ7g$+>4wd|ciH>LeI1Rg@EkYGMQdim#b1skUPxIE;%;ci!2MtOdEM~mWg17lB2A}*xuk@G&sRO8NwF&uxn)Sv1(JAdJX-% zg``a`F=uz`C*FJqd@N)TpfSlLiUkfS!f5gO6N`_0P>@$cdMm4*v$sB2>pO5EER;@4 z3$+fVz*aJ{!sHhk3Zy5LD+$|nim|UwBMzGGT~OuzaeC-Pi)~P-;C<(+05w3$za0yT z8e73q1UsP1ouakX=Aq0))8;t?&U1&x((?MSBq-)sOu%9_3m7Nf`L?D{F1o*rMa+@7 zV!d=?Y&_*L*X3Cdi&4};Issb|>N#Rws9k77u7??MzB(K9{feblxm39eBG<1_s;n<= z{M8uecSp*vJYzZ;$CEt1|gxY|h~!Oy0myJ{l%iam5x{=BYGwusJ4o zyl*&mP+`>cHu1wqITXTx5~u(+&aMmxH_nSY<-v3YVML7$o_l-++<(*E0Y0nhCzzn;30Z@W6Skf zsVXe|;+2Zl^D<2pdc8D^52K9||9f0FmsFKVIK&wSU~N$XNd66)?52-C=lPAH9|8H& zgFRnM_sNvso>+)@F}E8s@@X@T;6ui(in7yR%E}i<{K+O_0qwQyjXZc7`=AOOK25EU zZ#G(53IQwgDpja?iJwR!!7_KRJ_W=Pe(Cz38IcHn0@Zxl z8xmI1U)D!$bWg?&v_1iyx}T6h&lNm@&9 z!<#hQnRS06v-yjJsb83q38R|@tQFU=Si8RowCcD$!Ef`_xd<~XelA}pr=YII z&L<+wCDk!xl{_cCix?S0{+3B+g{s;(n5NobewgRYWHs{$u)@1#piSgBE`swTGIL^IrA4u$&*&aJv?sVPJmW_V!C%DBNY{!8 zp(0Q=+Sc6b701b=v`9fLu2Nuioy=kKJ&;q-bYh8)dDqnmO8lr>h1rJH&Ti$d3lHqR zd|LudV}{JMS6d>sA&Qy`R{C(xFS*IY(pd2M%3{1A3+uc%Q>#snl#-+$2L$iy@jbI8 z$NsiiC`g0v65G`FgnYTK%~T~!=Z&D`i;Pou$rwJiD8@`nf~L|z=8Um1E5}=-^R-g* z2bapWZf;vkxo`9Hu_?Kd@(X0XPhk}+EC6&;jJ*J;40N?9H>_8*35CqDEHNFvDnQc{ z6wTba3|1HBPn zv1P)5|9|dsw&DV79gMSzm-~q~Jp$3&ZF0OEYLr0H_z&$;_NS{9Ycod<{LLn(jy5N# z3v}56X8~oP7rH|`xg+_fY$n%TC){w(P}UYms3J8Ga~)a)-&i*g6t`O}v5nd}h-KSz zt9RXnW;?uggD!?~S+lN5=HnCTSoU3XZhFyRffXM5v%2N_XNKb&DHiB)dFW0FSF;@| zCBLsZi4y5TAR|GEKcQa{-W&0Y66%QWCA{hwG=6;jCgxCBY?2jYIQlOTy;z!aCbl~k1gF@MD3|`T3$OsNm`b3k|ke~tr6Bl7r8m8OB39_3ZKUATQu>mL!8DQQvj8_5k zqd~=h0w|%NMSzj4Z?mJ16ndpY&)XN|oaSKlgPA5jly~ed!L1P2q&svWSEam8He2Uh zMKVo~`TLOup`ZHR>F?kzZwlfl?ki=EIs?sl*X%rz&!~c;D662HHeFv#-A+I1+8%M^ zn|l@P-@%vGK+zr4OH=%AcP~0{D5|4rCtut|!Pc%1EZ&Xy<{c}Qzk%yAjOfNZm5ZSr zc4(usSP9OLgeeg6&5jx5_KKyNQ@_J(uoh@5q8EH!o}XoQhifSEj#dOfUHo4zP=`<|BY#wJ3v`-qdqid)mBun&~9C8K@vPA{nP zoq#b`>Zi(;B_AZPXfBl0B!BE~I+IoU)fwME&(}wO@$iD1K zv8rJ~(hR}%hPQMdPb{8M#eH~T$^hahPH}flX3(7K{Y+62^p>ebgH5o_x~LPRi(5Yn zqN;#N*NChy5AGk{z+F~f)kNccB+u_Y{aEi8YmP6ChER}S6plBU(@~xy3715j-YNRg4m9x%`4D()yz|7{rIayn({dXB1NnW`nXM<`JY!Zx+ zVS~jGRh!|sAh?*iNA3Q|;#y|QNXe*CkRp0fr2894l2QScy7qR&GA6g%^LsKBJdM|y z)FrQo8oor3v>@W-!gAt(t{r9X<1h_&9(wpxAVq!A&RPeU186hsD;iZ!jHk~LH>cK8 zGVkA#D5eGf0Xm%h2nq)s1pA^=nfuQEI*NF5CRRTHn%SY_;V$60jXM zFp~dV>nE_3uniHXy7U1*MSD^}(4$*0?g&?z&#R2fUK&M?=lWNC8%6EB;SiQkQu(-d z7{Us<68+9>m^xZcecwZ8LVE3K1zWZd z-}|k*PCIrQFVkONGb=YpsEg;M!8W;LSP^X3;p7$a!osEMzVCAN2+PT$*pSZDeUP%L zHt@94_D$wZml>w0&i4eK;r=OW7B3`uXC8*PBZDEsD8`*@K7P-<)xtCbMhL3k&k(uX z@qs-;8ksyYrFCH3F@P$$!p8{g5QH%CB`$mv&Q%+%T!ymPh$DyT(O!3mMx;Gl!NtdJsNka{pUb zHqBY}7j|IaN&s|%Nq0nWYsWiy)cHjj^oJhlBe6q6Ho55>RAdFFE0*QmY)<>Nt z#_4?FYH;Pd5qZk2qdW>4^!r@-jTnA}s(17t)^;~DuvXh|SwQ!;hJof!<(RI=2Aea| z2TT)rVIa}vT!aAR$HiM}Kx=q8*RPJC}!H^N) zF2Y9KZ<*g0a!W+1DLV;fcq?Hoz7n5Eu;z?Cm`vjS3ldpk=9!c8r*%7K8UaRInw)4I z$zx?C2j{0;0f63bt3Zg!B$UvRQ&YzLa(0p)3HoPA6rmv3(xJ|8L*;j3RY5NN@kcoN zpUR5Qk3JB3V=I7c-8;iZT<*dYAQT8FWlVi1bO?jO-bC2NpXT7uZcWfENUrwOoG8jQ zhAg_5$+fu>fkG?F+R*VihoQt2#V=n0mNq{7=~nnBRic*H$OIl`L)$VXu7vW(1KyVf zX>PRf=4rOF=aH-Snzk1;C73Yu=WF*QVtKs-<6Gf$YyUN}xuSU&3}uy&td+djpG8-8 z;fS?VxEDuk1kA*tt5^68$aC55*^{S3My`5qphbaHyAC%>u4R%V4NI)|tkmnXs7A==Hw_Dxfbj9Y{p z*AfR?n)1ZNCS|iC%|LQ%>MSPDN|kD#-`xP$`t^{nb*Fjb1s%b$fw_xNji>9vE_o@~e^r@Tr zX*mW<9J65BbId++Ot0#a+%Ez9mCj3yVyL2R-W{An#@18YgJjqD=}VKCcvNZ{e4=lp zushbcyrVtDtz4mEGr0d!adn(4nL?B?5KvDzEo4JH!(_BYu4u2>?#0UpU+kK82n4Zi z-PiF}y->_+-Jh@^z31=M%g;Gn*rF7jbx+^ioC{H?zfTc4D*s<0m&v;vC(s8CGD=ia zGtv!*Rd)vCRzffug}^FbPjwRGnNr2(0D2ySm@gyxjw!RUV62a-`*E0%ZQ>6*eDtlHeIn#!hL{bnqL;rZlpYvg+7w({o_Y8FX=S(+Y zT7UpSF7cp=n4x^~-?{iKZwn%|kj8d$4=>`UI)JUTv4tm=M#&{dw_^}3;8VWfGnsvh zQakC=1T$kmAe(3?Ap-u!*hi){mQ-ggPGrfLR*xn(bO7CgkMI1dgYs30El6F4p4ce% z&CK?~aeq63ncM+BBGO7d;+OI{sf&W+LAaIpjEFSjFFn4eCYdJRmJWBvu>c-xJ%2{z z-Mo6{jwN7a6pWJpV3;xg7^^n$lMoaMD)!lw3hk`O7+0tOpU3gw5omt>M4w98)4lBe z*SxPrhcA~V$>89sg?nHp=9j!0qxnc-jIn}ZTP`5fUaD+wAH9QyHuJbE2Nc(bj4_H> zNJX)|MK3-_jYM2oN|(;ie>?d$PPB8v#OkmN8hVtbaI_)vXmB?0lsNUe&qf;H`8cWT2CG z3i^GWA&hH*;xs;L!{lLk!s`tLX(&Q)x2!hRm(F?GINYX}`(TnB;H<%Ck%Jk zjPLNXjvKP{H&%7SF6WQJCU#2 zXj3M(Y0%?cP08?hV){nM8?juaKfpXCNvXbC{{hQ=L@O8=^4_VlNtumy*~_6}f=N1Zscl=m#k+2aea08D{J^zO-6-qc98ouXq0#7uZ|BC!p{gt4=lBNeID;2UL?J#xjhuW(ofH|VQC^dUQA8ctO zn+JWod7#OImd(K}afX~s&2UwJw<}pf@a3}T;ix!UM_5AAYUxMyv)uEGtwMySZVRD6 zG8!~)BI3Ru3)>c}g=>ZGjQn+e8q}yp~_yOR%<=6kWLcyB0cYLh^lnG&|{px-lBdGz#U~@gc-ly9Jn|oq22MJ?IyHj%rfNne;_)BtA~p$fk6QuUco4AeNe|9h~$Y+n`ifY$Ok+K>aYtdiP zI9*j;T@t}n#;deFo)?-poA5vnWa>LTAS#wwSuLMMD@f@di?GVx)@IT$c0$G?D2aUS z$FsdDusKoUL;Pm%ryZ9+^W5Q|=KM)2PO)}1gT((hsm#$&Jg{jve@ISoM_ZwxLIKel z2@EPkfFy~}d58|p8oIrd${wLfFVcFuDO#|tQ#MgH{{rFZJ&pZP}kE3D{;ZgnG)U+kP_QDrwvD8#@n%RRbxKBVJ!dWsj&5VL=GVlAs7tO~6|H z$G=$}w90h(0~hE6;H}G#4Xv7N+~~)+{AAQ@_LG0q+st3Fvd(*!9t_m}+k}A936|Ic z5Ghu0v2YkOsixz3l{6pueOq)38`AG-rZ7j90Ke+4D4Ju#@I8CD!|l7u{L@z>UjKIX zgw}NZ>SaD-i1ng5Nk;fwC*0&ItNId=R0Laq?(2CHR8g+@WMR9TqqziR4RlX1{WGpB zco)s;0svO1$~=;?R-s~~pvvMJ-p5V_H84xo@W2evN&g361i^O;%6V2@u1M1h(Z7~Z zloyElE%c+GEh?pakPNH&Xx4^?RCPA`SI*SwQ3D9y+(Dq0o5+=Tl`ZanqxNrrC!1(L zw#NICpi3{uYn-NE2CvzTLm z&JbQRyv!#onhUDoXgXNY-+g=vb+-w}5xe5y^Y?gF7*o2+rFqT1kP`D-l&Aj5`4GBS zCTfcP85N)+1SQ*p<8v()bA5({fNK_n&$f4vyiLEPA2lYB3xQ;NN5vpypd&!VkVHGT-g^>(UrH~Mcp$aFh+40CPEc42ql@Ug;({+J$L$)9#w*Hz>wu}{Vg z#fs)&-Y>pI;UCkfC9AOCBCQd994fD(+_`9|D4jOV-H_-0R1JOzr|2qXVWTrhA94zx+&hYFhE#F-aO{3MxYw{Ph2InaOnjCyR; zJDPIk6S(E8{6FC$EiE)%ZgZ~(GH!eI-9QD=pyVBhg2kJfnL zV@Ke8if<8jDO79U6G>c#3_xjxM%v;;GrU9fDqg+hB)ntvV^f%hUB7&D!3Q0zA)Zl4bl&<}K&+ZA26iKVmdHBjok0P~v{c8S45+In#@ z9{43-m{+uD-*)=s7AdtTVj%)E=LZc=St)9KHQ_5jiK=`+lK4f8k*IN!Jjd6TxOXr6+JX`s^=O;coe^Jgk7OOxmsO+;X~G446-NMN zl3P78+R3OMB(n{FB~VT3y+Ulyy+NiRHgy-jmY)Xyc*j_k4adz@uK{a*cL&I(sl<9mG9J2Q_KA=!_0zn$LVHFath-GEq+P zNBme*?88>Dn>hLM(M9*FhF_|nn*69jSnGz^2g+K{7iuS(;=S|TbB;NQ*@H3QFd8C8 zCnj?AUI^hgZq$_>`F}PHkEZ3em(ayKhIzQRF%*cx3@+#F8ju3&Jjm&Wl=s0WTdv*) zZe_(s{C%w&Y0Ob(Q$GcfWuG?n$EwS;ok8^u0t$Uph^{?LG@(QUigpyRAGyf>p#+|% z0SU#$!x{?iJkPz+9~tT>@}(@W_Lh5ehF=@-q1d;T@vT4Irfa)bQ zkNHF_7VK_>v9t8(8m~(+-P0>eWm2h%n8AT?3x_!SnTta+J7ivESg+vIufO=Et z)%ZtlIBXqz`PUA1Frp%bf+b5uXA?YH8?SyQ6Kn$l|E{?RSO0YS7U3=FuC1PI$ zp$lk;;MZ7r?(p)75F1eL(KX$<6s3@c1W5NP)fK zf-&|j{ovhvV;{Hs`HJZ39Jy}&wuKr9Jb90$qR>uaazf)(9%i9ZwSPL)<|Ny@=F(7A9EE&f65fZZbAh2Sr6@fU*_D2C;Z;Ch2B*fW8sWbL$1T6gV` z0{cvMDF9gJ(|lygUVQSde?&wa#$8cZsvbNPgoS#XEaA40XrDl~8pGQXA#%|S0%YIl{*Vuq}&#(j6hl-bh1h1kkHb< zHV3ZC$fxWfkl48j6U)p^fJl^SO7JUfPeMq*Kl4Is(G&Hm> zdcEw_C(0PC7|F{U9Ba>{H_O)-Ij14%;8Ui?a5K8dB-DLDNcx8)fRVZf&9uwvFK!1m znDdrXVvxFYHToI^pZX^oYZ(&5h|u`4Ys6bz^&^hjgj(D?*G5Otj{{p6dL|f_xUE(m zJQlD5=k~mHfNT88p;hGzm6vn*JyRi|VGH>L+^PfAo06m=Z`G7KZ;7ooiEc%;7AvEw z*wk^#wSLY&39?7oCcYk+W!!Eu-b^fny{32}W=^8P>3@-qB(Hq0$8VzRZ<*#cr3w++ zAAD1{TWz8gw&-}IX^1XFj5FtAAnAcnN!h@41R{oOVvc|lwdqg8lPSM%FwkyD5d5dL zNzNz5SGr>iv4zFoQ=7pKS~!E_m3qQqPK%E-)CY6b#rp)E6FJ3Q7%q`(M^9)E5np4x zzABa$WY+1#w_SNutt1A`u}RC zdIj4!xKXtU>Q}1F4_Ix_mK|f3nzcoTV4lNmkr0^VPDXBo1ik#KsqAjR;o4>^lkG9h zc2%`vkr(O4`c5=56T=_-zL$k6vAPg1EmII=&`G3Q2sLdCq|q)Nhd!WsLnol;MTUb3 zgyCqUJtlq(R1qkFJR`D7k;2dKanWf-@{Vopa~Q)ksl%FGaAA?%@bK3T)CmT2{2wf7 zg!O`+a0P|4{mh%k=A;VT_(w%bnhc{r;d)eQ8C$)^+A)mKSve@2%72d2!0-P@>}r&3 ztwu-}`&MwpDw(*Ab@7@&blQl+&}i(=K20Yd1Z3~^4kgjRCQiS^vreR9lFQ3nY+vZD zFa0s`P|6{@;t0`w!+bj3Go(rO>82gnH2-`8Z-O?9b|cr-M}p#JNV{0L-(paaxe-T# z`J6moWVC3tG0kFV1bMS(GD-_wBjcXdJ!HK03 zI7rpxC)xdT9w&*{R1>qwU`EX--o*YrKWz_WYT>&^6)$lUtGp`4&bNTLHz#Rk7PQiA zR_?3_Wy2y(imEh&1Q8-Zu>)kiAke>o1?`WDKXvg+Ql)4k*zyd@YzeV&DO+#@)mC+< zU|LRvm_SjGl=#G!4`xtALhJ6mw$VB>a;t$C5~tlr5I65QpnrY8bIbls;)tW|izA+` zT>Zd(rzxqCZkk0IeZMI%yv$_RxU4+h;-{Ac>HZ#P~&SyV&f_7 z_C|H<^@V$NXV`B?>2tiW5kP@D%|2JUY{bpq~j@ph<4{vL1p zMw9biC${D*tsu;u9RC4?f{v#8KipN0)_m6=`OCWFM+~gz)b}3P0FZOzGLRI{oTnLS zWa~iNVjG!9>v>Nkf*5!TR{MJ&RmfK8-v$png04ysl1(QH_h&CePO9U>WKSadR_?cczIA47wn{K{CNXO;N+8E>2;tRYE(Dc?9o{ab#fa@(Lf-*8 zB!!nfPug0747LAhEbh4fdQule0+kMD3g65X+i-)12+WZ>4|qes`m&OBeG;!B1oAz7 zsyH!Ue)9({p}`lmr{urc4BV~g{C;{k4fuv9Ta4L$;s#Na_=&Q2h^VIG++?goTb9wC z%w1Mh&`w7vDjFlzp7Dzlyh$q>S1fn%NgDz6-RHq~0_eB&H<<%43_fwPNHDiC=aSO> z2y*+p5mC6tn0K;YwM<#R1KoFFRQ!3>Qn~7W2Pb-mBpjCx(-VCu@NXq21MOQ5X_=ku zeDUuGdrSy%B*2d)f9BUgi0oC%u7I&qZ3c^Kui{6EV~-PSUrZLy`CCeDV@Q+9|3$qB zlz9w%F-9*!cBZ}(Kmd=nHNgTkDhl^KXWXj%&2N=Ko46r_hKXa>-^8T*Z3w%7M&vxuWxdZgy zD(?S0|9CUhxsynXO|Pom8Hq{yxQ{3nd@BsC_Qdi;krkGEDD_5-*SqXW8Zx4aHSrV^ zyL_U}riu8h-kU}o#VqQ^w_3WsDD*TTjjz8$=b_E#oa7cJf-G^fIMX15kLD)kZPdIa zfVpxfxlv;lv>VMUGT3ZNcm?UV-I2YFyl_B4#BUSx3_TC@y1Gu;F6jOV_XPHlVHRO3 z-FEy~WQVo?hw$5F1>Y03CZ~+0k$9ES5Lj6DIUZi7a*Y=s@{{Q@kEZD={I@RiXdo9R zpOlK;9li5WS*NHjWB5Y{Y~5_m=gkxyZ*3ZU__P2-%UIMho-^ps>#lH{fe`Wp-~=Go z{Ce9ThvSRH{RHny!{y2|@nk%X!Ty__cXv8X6PT4F8mV&~;a~=rcwH#wZ&t8p3^$3; z+tyLz*Ne;k`ETh2J386kN;U&OqESGY$9a5uj{Zm?L-P}lbzX2xz_mwwDfc6dKFY!= z4rkH!8%n%gOSWEnc5A4m6;)Hiw8vSJFB>Pn^htN$y;A>Xy{%p>Tb3WI;P36ITt6_ShtB^f^=7=5yA99sovt|4Zpy(hQeSo~f+U5W0Y88kAj$EL?GI^8 z5%5zA)Ij{Re#<6g+9!+b?d0ZWQ<&+OIABuHN+s^6(LdkeM(-16V$z4jH`l(s)oB<_q0|BQ~5sx~9jv9rmUwbF$uvat5-mOY!L)<1DC}G3|v2dhL#O zPWmJC1mZEB`bbu|9SH{UAk=wqZiMB$Wx{bXKR@?MOj>+ed$gTiNSVQQ8V$CU&q)f@ zPom)4M`%775y6NNT@kz$S}4q@$m&q-Dcao(&cWC!4i2EpTqcf#6i?#l9wtan?}`lb zE9lFUb{!rTt+0?XwuUAK1~q}%X9z!7ib<|W&^>LrV2DYKX$YH-{w9g~aC|>pB%kCM@WT5Y zwdRACNN?V6ikgov@dTe_T*d!N+)YP3OpJfdT{b0M$TgEFS8aVpA;x0QXxW>zW$4{Tn$p1~Tem zszwZdGn2}vs>aD@FH1y z_$r@82{*KiH1hK^BXiz%AIOCVUaf{MQ>g2?RvJK8ML#isPORGj0(#u<^73GyNl`e* zc$5WVy96yEAY&UTNNd5!G!-3N zCK7sqY0uuMRm#CS#RGBXzP?dPhk5MyqYx(v zQke?i1P(s2>#sE?ti>gP`sH3Z;{gWSCOZ-)mfY8i?l2N@|g1Z&k1O?0Wum}*J9f)&X?d1h&O`Hcx?u|bwf;J3c{u8 zWAb=gQybnTR8Cbn!80RG)uw}t6mw@C=Rwqk-~S&3_}uk$6T4N~JfrXl2jqNxk*+Zx zNy;cSko*e9p9rM2K zo?u7pN8@$cz$ovV)7}<3i{>MS^Wn*YIIN_oh>wbSqCCUZ6ruP^Z=T9hVKeZqTtz|z9^;D0xt?!hxq|m=tdBB&H?w8+%@0fl-?YSIa*nDKQ z68V8_1f-tP7U2LZ`W+UvX?j`Q9hFF4gneBfd6cbBgTPb#i>1CQ`~Wr(+qqe5MEdHO zkHsD5-5$-QQPv5PM1!gT`xts&C~l%(o0kZ zR+j;P9GR7HfZswuq-OYjv7T!gBBXE98sj7ekxN^U%+JD1w~q9k?)H}3bXbQCT*Q|+ zRou}-CsYF6=~m=PV&Z3NZnTx4{t=##5AVZRbBzP_-`}6mE7{>jKX|kYZ8CQowKi2J zIS74(4>T#Z3gU{Hk{A!VkD3s64CWt>6DxPGa8J#in&UZt%5FgOh>bk5U5TdTNi3PnRyZ-psiiQ{`l zW0R`UV?nqP`0xL1FNM}PrSfSZMRytr8a+Nig-#NA{`}^eQRrpgbU3hXLQ1-U6uM66 zjKP$!Mc<54nt)lRey0fw?CYw1CQ0Emt$u@8*bS~BT z^{Te8yQjNg1S6`N%Pc_7u(OA;X!c^2UpU%(b3iJ`zmT@xRI*`TKjSPxBCA}sNM=w7 z?5f<#`ztf*cXW5dVm^+gdc-o-tMoq*4Y&o@0Fy$#pOQfvN?rtAPtGB~qw=p<7%B#NIBQkJxz#_b1ljGd`R+zYg^|qT5^=SB55h_xmW9zP{wzel zH#F*{@O*nict_;_A?WBj@ENg*Vk9wUI(nrF_5*P>zsLiHLVFnNWx(_Ig z4`#3#Nf+za9xBV?FR`erK?)G?6poYquWultWjGKn7;jJ6q;{bNS<>Ky*Cy;?MGfv4 zvUMB7K*?qJPICR$j;TXhZ27ews{K9}r&NGx*JYyzv4A2-7_HtqlBc3M7qvQcS9vO^ z>L|gwxc^Ann);xviAm1NQdv8cTc{?wN}sNgwx?H<{CKTC_p*GZ1322;UU_lVkysZ9 z;o}1D!)o#70e+npppJ%`P1=J^PWfszO7h)mM55+#O_upAEm1yDo38Sc0#4?HfRdrvx|1)~u^YBnq-q7?VSN?_AE}`uh zSb}h`7@m_LyGe`y*qVvMwWGOkz1u5A3F>T%UBVCNqFyi*WI7F{-PZ!2B!c_@Rc%)RV%;ls*An3p5>c zodA11;*hQsDN`r<9*6E8(LIuOBN0TTGWq7h;xjWH{J&F|<@<6%J3@wTnzsYTGWU~} z`ijCBMCTz}lT3*-W9aue`#dI+q8uuqV(r+OxXm-`1NhNwWaJQMgWw7NmW8 z=I`BtOtr~&e8qm-@&R3=LWOu|vxBVj_Z+YIAh*Ylmtxbn6-`P*$;K;5b=yz#q>ko`x&x&;F!ycw4gJ0-skEOXMY`lxFvR==UoOQV<^Mm%r_j6&W{70 zFM?L9&ntU*(PP$1O)Q+N;|4^1v7A7 zf}+Bgb>1fktW;}q&{%9~LCGO4?52m`PPWFLO@lQcQPQRM&%9yx-wSv4Oa#kFGcE7b+2*JE9u{$fC`}*) zna_V!L2tpsd0~=PSR5Ep^F}jjtL9w=?Go1>*ra9)@B)9Y*w;_?gjG%4os1s8N=mN^eT!aYvl%ms_~BoS%#;Xd*CDebI{@k2;O zx-Qmejh=B3lOw^pW|#3bCjeIx4{ZT*w@0ljMmlv{F4OD|wCA=THTC?kkDlIP4Tp5L z;NGY43E<*w9Ga^P#yE3}sFBcx{ia)@`IulNEGH`ZcSD{7JuBxFY7u_1$1Q4%K0~@f z>qy_rE1*0vDoEE0i~kRG`>mRePg%>m#G(`5jmAAj-4srQ{s#1Z7tGeW*lZUzO@OFy ze!sEtA-N^?Di0G|pk?Vo;g|#)jkygvNnK}G{dTq`wn?6jScr`tO?X8Xot z_;B&?J8Yl&u$=h*zERrMZ{xfz9Y};`;RnNG2nC1I$8a~tKOHJXYvU~aUpT#KIDGs4 z{J%XYa(`*YQm+uQdw$+fv9`{E=cwIIR(tS1M3XCEqJBbT=J~0C?2U|{vxC&i@HtTm zujPr+;RpUi6Q@sFB+^>vHyt~;6c&V6-zj|osi#%K=S6ND68g%sScIN!HXEIURy+&o z`v}`_9QD%u!&-|@-kCQpMMf#00oLSwTc=`M)oB%-M9$z2dnfq2=Lr^}E-8)^M1>DC zYYAh6!=~fFEvk&DW|sUgFO=co+J<VsK*Ue1>&Jku45>y(n+O@J;#8HhItN&#(v+4~r!3_( zU}mDnR;-=7?Uct$veJ%&Q{qtw+pgK1)g4j`*oYq!UNO@3bzC)YaP~%2;-2U7JIbMQ z&TWA9%=1kb1^-gnji+9uGL%e{IJfte1gafMkkw9{9W-TUi!z5?BC_udI6n0j@zgXP zTzI0g<8l3_(*QUzv;-qJ;+~5-$Y)G_wgl-@aNaCaVDpi`k96KFADc5+@YZ83y~jus z)f!BJ0UN}YX;mp1DJZ62f}D;~bMZcCU@IN!)H7+>ahEm1)>5COINkkkdlQ>dir5M# zM>0)ynIZz{Nu~qEyVPQuzNu;l8V+n1k&El89g+>pT8UNVlPhZ$I#!}h70)~^PJNXL zGYBez7;;xdcmcCa`*jd>0vYREK)HjV4i{Nd3{rsNyj_t@ObAHScT`%q;gsXO@w^BJ#x}dw7AKrsG zIpkyr6^C(7M>)#o-<>u*P}dyF>dwt zC2~bMrrT$5g>`L7e1ftYYyeQ$IT`-Hurzd@%2Y^Mit=XI)=(tPFCe-%KlH2snA>cYO)1cxN zn;m9+AEEu|YuVtEMV9@R51B*n65I>HAP$w}b;f6rJfQtOYZdAcGa7X@__OH!Yei>@ z*7{1e!QSqC=wMEIKjwjy*tiq$P$=`UND^hNI#IGY2#$-v%?=tYyr%jJo&~e7lP527IY3_RXnE9p~En!eg0K@*%73b$J1jR z!_Ydp_GGr4_SIP-xMgQAfi@ZR@2jw^3^W`Ko?wC^He5zi==mk!mP;c*ndrn$#c52V z31qFX!y?AKZ;luKX!({2BOX88b;gN6Os%vwd;)^DnYOm=Wp{&%~1H?ZL(af8YQWDzYZYD3RG@_;r(9w!)oV2U7PG*_%7Bj zJGJKDyuS)QX!gzd30tu~mw7jJE81DsjZuO65zMW0&8_XJeDqR#4iQ;k#WnM*x}1{3 z>x4idT2!n$g%!-M&?p!SD(00+c5Mm8Mgxp77O9Z=9jX^5DZyK>%s!*mn@QP8n~wzZ$bLcJ|4iy31Qc2LL}cB;nLD+PzHWe$*M z&nnodt2*M8ayQjZjM;w#bZtp0aB`_Pr9PJ-N*~D-K>$OtKp+@yB?8wVTFl7^37icb z_ZMTS%>qt%T^Eyrqs+?d!?slIfKXwR;nwofPF?8uxy;766byp0*JmqL){f#5{uNfzaG95*QrhkOpE zGQQUB7`DGcu7c3!cV#1_%TAV&VjhjB+|(NwILiMJmK8;ns@Wu3F3$;9!zNy&*SHxb zzO~@kr70{}V#5p^n1(nem*&9?E=@fZt7lH2>D~oNSH6>K#+iQe3X8RA!x<@=vvq%G z4vrD#k}C{U<)l}ZlvZ09+6eOV(3DPm9L>%DLQ=|VJM?=|( zNgO`$=PO{Ms^e!RENURBjl1^GrArvf@K7>6O8}7t{kd zGnOH>nu2ko8mZv#6OvO27j8G=j!~d-$87V}`C1<4>N&nu)0QlHxb6Qu>Ke>jrPkyI zvgskt^=9t_D9@9A_7V7-(g_iQnOVdZ$UxTy0p01Qn{1AOG+7RvN((xlS*qq6!Wzn6 zcbuoL7KO29J`|0M6W0~8@(NO(4lve~G!mzzF*^47($4=VvXU$IxPeZN5YOdA%DwnD zl4yUc!Ez@=#KnVUswtBTEou)>1EyNZt3O|aOmbs3*@e}kG4rbc;-BlnB(`Ae zd^!jVNkkY~{#=gfVu62cT<9`~sTcn(uA=-8w4gyI@jamRM!x3~8{xk=fReATy5zZZ zF%A3IwC@N!nqpsP8c(XUFpx4xt(YbWxTU-64daBJ5FLFzya-2JYej>3|uYM14z3M-~>y{6}>Nnu`>+pJE_&ungW&k$NJdbRp zl4gkykQ0Y7Mw|S64=!#t=BtUCiUXm!ZDwU?mX(J& zsEuNe6s6$W*ixa^t#nBAM*F%8tkr#_2?jvdEMF0t`B%UT?Sgt0&?9e^Az2e{=ie10euMO^J@3;DxKw5 zRouwbv7}~6U5**LtY$k=7rQkju1#*N$qBz2f=})Y`%UZKy{Xl+N}M6wRvrW=S3h2A za;k5;xjr-MVJ|>(z6j7SdDMirKgad~#WALJ;hbVhUST@vqIlqJi-hjj;ERcV1mz0! zGHxg-U7LooiQBPb4T9~z^fbAyE#xf&Wj9VwQ@fC_*M#R)3I!cGO5w#LWIln7o*iQ0Np?` z`#F4do5KsS^oW>7&vCs?2e&?YSPb;Z7}NYXZT`S@bc?JQ4d7Ai`JE2mYA=vDObNtQ z@IUH7)UJ63fsE<#0dPV@iR1BPGcc5VHJ+(JxU3?cl!~;3i23)OHPUIt71s7`Zn@93 z*@~9iq(6NJ5QlQJ1h|d{@P7(j2nw>Y-0^H99ScooVkZVS4TeQAEgs_Cw6zSLNUmvy zCZ+_-6qSJDAridy6OD#}aZD=ykNiygF!FH{r$Nx)*w326`LVRMjfw*fYFSZu6Z@5tNRo**vL=s%=x@(NYJ8x8lma8`G>-=r4!W-KtfRuC^^2Cr(t zg=?{I4Vyp3H%u`CGflTYN4IVn`om~#v#}cXp7_O)GRa>!JD>*Wme9@1wp3U3FKQf- z{WssX91hB_IC(F|bYzji`tfqB1jTQqNA+YgR@l| zj#>apGpW!UOs<(?^P2r!q@$$Wg^ZMwAAm)H!~h7LzGn6`NHYr?_=Cz(Yd-AR@-lSO zP0*xwp)i=h10G zQ5B(pi5r=>u6~hkP9A&xr+Et=ZE@Op%dwSqn-15ccwQg;SW1Vulc_n%uA$r%YOMb% zMiUgewkXWPu!kC#Ppm7OK83tB)ovk^>Xp<+o6jO{;u}jpA-*-8!1&VN{khu5QKWLh z)1A?+nH_$M(Tj^KgZ)ywG(6u)ElOl@RPMeFrxSWSkN*_^L)418{nXi|c^T!DVrC9WZQZbF zcHdxnu&lD@wZp4vX>D1ls;kqA0S5QuoNP($KzzBVy)wY3(LXTAmD_MHz)^tA+Vpf2# zhK%JEoF??N3)cL!8-lXDGjKp%KBV`L7z@y=HXu}hKPnm3mr&#HcY(yjTHM_WO{KB5 z6Rxjm8pQLndSh-08s-{^8JJ5=e4`>dTn~F^&;qY*-3%18@Z+4qUKXR(FOxgH0tk;@ z!bt)s{>eb;4pAqIo~nY5`;Xd$?j)RI&+=9(^PIP1Jj(G)skuRThc=f>UTESpV<~r7 zM!@w8r&I;s!Kidw(ltalESS1_c>$|_F9y6BX|smRzm!~C+1$#(%_-}~2~(u{iko8O z*gmALsN8aRC=`+!wiyLI_%=nY+niSd7vKJpX?fED$Xo`};H%}1hcjxPv+B=t-c{*o zXt$nzDP;W3yVLIO6WI?^8pV?eYvbjoLc+ zPWC9QZVi*Oj&U0nO|8YfOvtae{WU=lrq|dc!97HhX)>|i6-p;R?nY|CvB}zWBR-7}qM?4uSyyT@4)Fd@d7qQ$CH_xjzmw1> zd5LL-xQ|Ogmw0-MZr+V)T zM&ysSnFU<%L+}~X>G2344RN-*Ti4!Vluc?qV8ba)^>qUDYyIU=NJL8s!9eNfTPY*+ zs7qT4-A&@_bqV&b!Wy(hu`WfNmUK<9utUi?YJvghD`O!pRwMxhKOv)`PtlN$CQ7>i zF96Vp>I^hsLXf8a7x2imwbZUlqqS?&5w_?BXViz8dMX}_o5ja6wQaggf7ZKmBq&U|@j~AJMu<z4ZRWOBzOeV$5|Euaw<; z^Byv=^qDG8Mf{W65G#4zmSrW>qCbC6$Undtu~^V4Z?JS1tFZmR zhfW!!rPnBd)^k0jeRI>Z|185}`E=IQKDxs3ec+fG;xW2}VSJqpsS{`Ak%kt&4JQ=5(1n%f`iZ^im>`*q7ruudqD%wp!yHqVw?J?aPmsc#wBv2q)?nIgEFG7v$137+KqdyAb-ACfGvV4TKZDjf68#T(;l6ep;eZ* z06slx%HqtQoF$J}v8I)#Ot_3>@3Fn$sy##md-Vo;9|;%4>Apjiq{D&i{223irqUPM zWV1UXgjf@Yi>-U_4+s%Zuj7#JZ zwgx6w6Zh{zOCn0MR^{WMup6uH+fCmXbt4Egh{5>EKe6Bv3|Xq3-rj2pg(x<+d=oBL zI`uxEj%CWeruKzl1Hl5_CHq1FV?DKwbc8)cHX@z!5fZd@T}?Rvq{V|gT$mb3hHyQ! zK)+-kWdf8e29SBaH;Md!PkQ&|4$*QF((IM(AL@!9?jj)~4fs`>%M7xYbSBm{?MBwz zC2~fvSxN@dnNd&kr=#I75*9KELoi&qV9-5mfN7bn2M9SHNI0B~B;)jVB8BtLiY%4| zy7jaWgvF8-wUTy|F=b|0h?O`NLSd2k(*S;E@-bphIop@w;a!%!KnSkL?NIe#&6kc# zL!T@8Oit(^L}gKFMS%B)QFfM9{mU}WsyGben zw~F2obXFJo&~cMrrmECB<^_pc#CRDa%(kCmd@Nv)WE_#adQ09f-Gx^g*4}LRC4?iK zLc(iNl=lVh*lxMKPAX32^gG+l5sYfcg#*0TLkp88&bB(4-zP*`=v$fHI|b|9zQ)TL ze}?Cwq*6`%TA{A8b*BRck?3<)!4I%bnT+d6D!8%pAyOJ^xnAkUkaR$bG}pmd8KkCH zM+>3qV)szzkDsd0X;Mt|+q6>q=|%>rpf_mwx2-X_+Ry_v}KT3H2YrXQqBahM(O2<$Dc?_mcU zKVT}xPAcYO`liez5DGWK+usCzGy0^`I++%ty!jE>8;8C9DM$MNY)VBfPJ;2EEB&U0 z7W6D#v^^0mrQdbHi&ad1G?E^1>D^e*EeI5?6n%y*jkXiWSRkjPZ@9W``v^>rICT7i zf2o*o;vht!u;FxY(h-rz^j)_V46Z#fNEW&2sj)qcy;$AI2$lTga-`@tc8(Gm9B!5~ zDVlRBECLm`Am8Gmy1jikD8YMx+S=LM7+AE87hSH_3R`xb>@pP)pl3!Z|k z>*n7AQNp&up$X-WEfB?e9jN|jBGbS{fePb61-R{-4=Sx=ur$;?gF>{5h7mdd;dVK9 zn}dcxHFDzUBA;p^>b>%f@%n7JDv%njX{*S7VlO))P}?xKQN)p?jso#ym?jS&g*ldu zGvj28r3w{F-gKZOeCYXR%&QlUbaJ}pOaFEM4DQ`>d=M%SG7>dCEHEw?0toeF4M+?$ zNnQ~xlJ7GN)171cJZe@8`3XO~5BKufD6+*@o=KxCos!%??ywhkZ^Y^)LQ7mqKO$G- z6Kee!HrD}SSv(?;`}yJ{O*O8^IhA$l4=FLIzfSUdXz^QZf4cJ_s@v2gdZ(RRDBX!h zf8JN;$}a82?#fb`#5F9hKNNZ^xaEki0k-ijGRLPnbEx~e6=e6YV+4RZ$xYRU4$uD# z0W4uAwFKZ`69&X>>#~#qq7o)Q0`w%)mUurLL_Ru$m|vd#WoFKAs~BVC5}+@F+D_;k#~e1Fk*`%Cw|_w*N!uu82cs92ox ztah{$3L9M-hW%#G@T4tCe#Y8f&`?XsJV&MS{LJ;8qpr?Iy|;*LlVhZ*JMlf%6^xL8 zooWzlZu7a2bUCJW&0DW-dy(4R7C*)(#qg}n9#k|+AUpd>Sa{Aqork!u~x<6>`5U-~N77M2{^^O*p=4@43n< zzGS)kip(K8X44~x!1#R~Dg~q5bm+7nV`2|(LN;$mk%TeyL6XUB-3NFz&p@?NzfI5v zNx6nIYMZmXgw}*l)g(c{j|iSDL*fHkPQvsnzmCzJp8Ep?%+h~xg`tQwA+;E7jRE#i z(UxGa25=L><~YEM?AdxJLFdyYPfv0T%b_4UtPC{G@auDMEZ36cMlc2sPN{}=lC@YF%d&t)jx3>I$i2l^Z8b~k-IkJJ}j@GmXp1)frV)( zyw34%)C!;p_)>CFYxj`lnGXLhH&TCa?oZJ{&y5~iOy2)UFObTS595ZTD5ia@dw)7P z01+&FICL(J<=;SG0(m-O!R_HEv0bMd0Z{@zJ$Zb3(Xht%d)pSD;AG?oS1CY$awSNS3;4T6?8Axb{Wj=$S})0p?ph~!oBoKTsBNPWUt z;SuBO6fVW^3PYSy{&2*aERS||{C6(_KWo^W{GGUbUTqh-GusTqY7g9B8})vUF~Kav z;AG&|i)W*j_tQ}Y9Y$0vr{OwY#@4jiGI<6dy&xIL{dKna2K)XyYd?<5?Y_iycm`hu z`qNkJE_5Sn2AuS#|5KE8rfK+zeqPYz0BRIY*mguY4yNCJI|t>%wR@ZAj5#9JjoO6H z5omP+Gv~vxVFT?*L2oKRTY{zz=J6*OA7I}nrIYEjl|8HZ}1Vhp@@HVCZ8>U{(!j_ zwMUwP*Qa_RIPY~O6JBBwd=%JpPjT)_Dh^w|{j~+t25=XJ5Xy3V;YYJ{Gh2e2%Rgv4 z{LiiYGp1?}H4TB(@8huxBY43j>Ndoe#|-FaGUR>~&Ha>+Co_Se19QW$kh7n@$2`Q+ zoK>W#3Ov)M-g#o0TEm-kwVJ1jhN+;{#$7*hlyVA5QKk`d=9>D=D!1v7uQ0sa6cYQi zhGl^sR0wl^Y^z&5taQI+B0@37axTE*|6dWL>^ss$?;)nT12OgHQ1pCm@0l3iC#!dufHlJGq0TS=al!jbT_Ct`L5p?3 z+ZK(1cxE+|4dm%m`B-IteuIHtAnTbY`246-!@&P~e>CkC!+$^nPp}Dcdzmf(M1Da0ozO+SSSSM)D6B1K0Fhl= zF7-tf9YK7W(+ev7q)COUMsX#bD<(1_4ow)2Oj#qf-L%A>hv|@m37*+=ej2a8c#8Np zS_PY33l;QBVC1_9!N|w@BAhw$EG^$46N_Xsp_4v1MI;4 zfJuj{zH@*_HL(>n*dvQr8$6sv`~;M6I^imQ)oE#Yul&7iOWRHft0EgJK6ZNY&| z3`)$Zxcxw_KV1jjtjBi?O-blx^p)kxWTMiJvS**@@20|UPz9Ax42DSi2&h?$ znPCOi(o3|^OdSU?9vv*(wsc}`Ltb@G{a4DE)bLn;^@P1e;>{oWtdTHfoE(io4qnLn zurgdlv3x-~a17bw&E9ptxO595v9MKPYzh?s1}L@fbZ7%^1eUCzy|)2nJbJCz!m*yu zU8*EvTvezTPg^>1{7PXyycWsr@jOyfduHPGA>krTKuGrcV)1s`S{_(g33_hlK^vA6 zqI=Jc7X01CDaJ)8ex7l01l*PmD!LtrT7ke~|4MNE;f&9Yb4Gnlat5Z0xHo+}cCOaZ zEcZ*e+Q3tBE;2z`6u}AoAY5Oz>t{vEp41*>3&>G0&E)|#QK|%I)t-54wMF0IaRE^y zx`lu`++*cd+RSzpY|do~!~VxQ6{Q226cE8k{7uf|*y<4BHAgl9o@*L}@QfOnOvE=H zkb~oB54}}fT)YtFG7`db^GU8;(jX7c)9eT)so{(okkzmb=4JU*>-tQqldC>$l&5Et z`y!M`lD7E*+3=I@e37I#?ZI(c#1LSZ%eA_o@P{^sCbzJg)+#f3RiF#VE=(c2*-&4k&|8&JGvIfq?sV7kP5i< z;Tad66RG)zFb7K>bksxpI%3gCLD9Y^54|;sBskhrjHqMK00pKceOx1az_B{ex%6Tp zP38Y%5jm78PEGC}<*E7G1^*mDVP7h=ix?RQMc}-#;_7oezSw^&2$nXPTsgF%4fOct zEhz&-B^S306v+7@*niynE}z$lPh7OC1;Y1MnG!ROif8aQl)*JU&gumg5d96LmCdd# zpIWGZ=ATQK8aYCH^jWCxlp9`z#XkU3pe}nXvl}KSi-!7RE+|CHy ztIq1mX9FMAP}1RL0Q> zGpC>VYnFwIa4iSM`Uqg#-N(wSL=y+_z0XErQ@#)(5b`$nX0t4s?JxO@u`>9yjT|Ut zM2r9%&zs7_*2hkbp{7KPMaU(MGz5rEz~OLkD*-pM>Dq%a>hyqxQ>IDVkj%fnFx^X#x+D<`A{Te6Eh0%Z3f zH+97zo|(RD>c9h#+L)PNIVJ2AvIJlXS?Mmz(=qpp$bh-|119j@Crofo0k(=+xgcx?1_{1ijbgV<@1{} zL4*1xoJUAD;m_kI^h>srJgx~-b4OH~*B;OP4WeVoYTAp~x}aF+iKBy)P6mq}_Q5nj zsUUuLA4Otwrh?~bUwG-8!%v}q&Y}B41cG#MK=+N0HsqHQ^?TM)q`E|y7Ub}GV8pn% z2$)Ec>*V9=Oti3B@Xb*8&5-$ zUMdivy-bz`K)Zg0tGAi`Y68a7 zN*1k|9?jpboWW_&NCm7gWE$(nt=ZAO9w&>&IxTaXN00G+cjogP1mH{Cz;2m0vh;5l zCU}fB5_Ii*NIEjse}nKR)khfGQR~zZUsv_+){c-Yl7KC#Qh)i1yB7a9h4thXm$+61 z;`+gAmC4a>IhClL%w=B@Q-U3fpmk)0+#^Jn8tveUK;ns)F1YFCvv^!hDot+jP`6lh z>=dz^cT|MozXI2Bs#=L-ug4<%uvg;bQ7JOXU}Aq!?%mn0YY%GnVx?Es=$Dl3-g(FzSN)BGqz(w(j}iqGh}SUAqy4IL$l zz-TLR^0XQYAHxQ;+Hx`KAe&{ zZL1sy^BJ$&_$mYYSuz_57r71sB8H!ddh7@wsr8a7dWm$Hx5}D(`$tX+oyXe34lKhI z!2dT#_HS9B!rWNu3>3|*7nVyIz`yjsW^xzdR^KjcLyxVspMJl;1+mp1ersPoi;(jo{5ZKK-WxcQLI;?t3}wOX%DM`=F`k#kxzMeS0Fh3-8aMS*5g%8H zv5IxQB4MM_yeBcnwEjMeT-+^=q?1jWaUMBM2;86kq9$&Al__Qln3wq^YH0Jz-Uc`W zz>PT<@ox%JMc@z(%_}Z8!9q-smq0&i+{oIZiCv|@N{K#sItL~tqZ=IH2Tz>l^(3Cb z!!o$ZQRHY!AudtK7X8QNC3 ze&*t53I9#E-?xt$go4&e$k>EALgZY_QJA69rz%dhL7DO&+mQ=4@VX?o^4?egb?M#b zkZ+;cwHd+LPK198Yg)3^=wXsrlPGSt{i>&W379@h1yKoPbgt9}o#VrzbAo0fP|DoG zJN&R<)6YJJDV|N;ulnnZKiWuO_Z~gO={;F#I~eOTUeA+I8%7@L-o)K`*Y|D(VwAHJ zru3IXbgx$th32aepxm1db8J>=03)1E8*N1kb1G}%6Dc(M5V*d5>6q+`8jrdW1v>o9 zL>Wp&=N6h)0Y_#odRZAXi>Csp%4^D*bh`Pf1Xj8oYHP?v+>ik(SG8ADdBR4xJ3ziz zaW?ofN9g(ZutW9FyUE;IitiyI(b_DEy%(KUMKes0So+rDw*3MhwG*&y@zf60`E90o zcAx<;j+s(+w+l0%&BP*Y`%RM4=0|-Rme;lls$V8Bb_J)0i$^k_*Yw z(3i3Oq`Tm1OzIT;)uf(~F(7eNwS|+@m_VrdBAVvw$*;bzA$WIXvZk$RtW=?uGWC2x z&L{oJJbfE_G+YabGujA6{wpAy*jJbb_Zx|7q_mARB-otonpz68` zJ*v)SF!;t&Y0fyetHE2@q<3`~&U4knzZ0t5@CoO@8}~_rOb*KrPUy|Z)}uPd<;xGD z3l~cXy~>SLPN{QgC3U(VaN$#U;B+nkM{t@-Gv8KX>DAPo@ZJMp*NhyvyAJy@xuC$Q^vPirvT`qxNPxSb%jjIvA zmB5NAgA8mt0=dAY!0nHXNPw^((p&fy(P3YxC+c#^%U~^$!|gI+a2l#u@g|V$;rqdg z-b^ZUO84s>xR2R>TwFXB*}xYBV-oD~wGUEbvXv{t@9dBPL7*W+(tgthc~@K3$#AQP zEm$aLM7eyhp3HC82g3s<>2(TnWuw|>XQk_i;t+VeXa)7Fd)ClgNix9rRnZJiFZ00{ z$cA$x(Vp}BHRNH{NC{XM6{S&hnZA=W2p*!A&kJl&YGUP(<)SQ}>gPX6*9ZXv!0sqH<&Un1xNL?9)ByL zOxa>&n>#Rq3G;h(E{v12df%o^lN~p|;^^SvZ;%5i-E%9FhWi`BVr_CLj)-PC6n^m3 zhvn>UqVv5RMPpD@#`b!Sn)UBb+qt06T>Y%N%8{HhX%4uF{qZyTCK(;|BiRz26Ef<6 z>yLAe!si>WH}C}l`7%vgE3~H8dv|oi`q{LqkV=z|i5~#4(!)+7Xp$B?o*Dc^nN%p3 z<``%3`AqX*_S`IO#Fin&hAU@Vi4=xCbi4z#6D+i3a6aq+sg1$)$Q(*HEwlxy&;1@!$(tA)q1=pDYa^>Ec39j$)*gleX}1{# zmrw}jgF}bLJHQoIr=K@Y)#188?M;Hx{3TM~eLDtyj2f%!76w3qN4tNkO4sYfics1Iq- z@NB_^B<9hHM%X6kn6@JDHxFpTkn7Mg6VF~r?qvMDw0WhjSVwr5AkE_WfEO~xJARp| z7SZs1h!6J1PZhK__l+$O4*1|s#_an}Nw=T#53;hy<=wi}&exlZ5=s5RhKjJc4=yx@ z8ktg$KLm{HV!v8KUK-}}SJNJn?qFAB0vGw?3xB>|Gpbh13n6cQdBb|)&eylkkaqSN8l+tafW3x;!B8ct6A3ex zi@roAcU+1vY|Ak>Pe1pk!EvJUIbR|S7gVXPLU6a_oVhis#Bd1Y{Sy`hHwy|NK?2V< zi&8Gbrqjubk2LX}*d_tWcs%n6^Xw$2Z}ra$2G9KRF0%U%N=s0+947*388g!pigT4Daf{QlHqSfC8(GHUWtRNwooqsW!ub%@(8<9 z*Lvf|Y?L;>^6~#v$HA|;YZe0k#NSlzsw78zS&AS&hd8j@1~7UC>~E)-Ow~{4qY=xwiFzM{W%80b zQAmVZ5UE_#??QPn$umG;n=gX`U}89~3ekZ@J?9$!bMe%1M#FLEU)u4rop9%i1WbdY zJ{RoWdL4s1Pfa0i+B| zhe{4>;$x&wWyEv*vXyi~pS1J9a4D%~q*yYFo;wDV+exiE56|qLUXttW80qqYN=$A0 zsI5|U5jAWqDx^^TpO}TesixE$k4wHQLHrueS9TPCSyyn;XkHk)kh(R;0Kq!?oA7c_ zYkLrJoJ~kp8j36%Q3geR+bWc!#G^6W)@q~!cvF_;`8Oob=>=JiI8S;*N$--}s3I=Cg56ZWA z`@&ka!G>W3k#Wf=`-<`Qy=#P75Ik!cPX8xrJ43$gSmNtkzf3k^A1URQXbB9!V|?52djvmk@-n5}jKx`s=^lrK$qD+* zZ4Fv1=CB8~g*hDRcwpgWGr`#(A%YgTe%P|WW#Oh;5yrTvG# z45)c2o!>Q}B{t1ooySuEI95NGULT4uCE2c4sArzZEw!E1oDcgsgJranF|GZ<2u4oj z&c&131(vHvo#s{n5sY1Qio+pEuwE+b9%QR`WoOZTZgS^#OAi3fqp2LHl)gvh+j_n^ z0J=|zhaHxC?rV}RhykF$eQjFi0i#8=%gVAs-I>dC#0&LP1WWjK$1PdZ2 zd0Jit5_@2UB(;3UF5`tM;NjCFRSL$y0@J-J3qd|*%;0BM2*ez$Zq7$=LcCdDV`>}! z8mu)=wJVz^)gks7v#-^2gU@9&k;iCh6_$R|;Qg{sq@hg0EBQ#$Mkk39wib(s0o4Ww z-}ns|am>XLVIHsfLA8D&AdSEb3k*tG72w;WNFEdm#V_zldnl zE+z@l{gIk7=&pI2zqEI>>wfL*bFUWfLQyz{!G*~`n7}}6y8(SEHL+En_w<_})gTeo zhgG$sZ|Q=F45_ZC;aJZ!`4uP08j~(e%WBd;6r?N|Yode~DzEmA9tR~fP^dV>d@5Y* zcEz^(x=qsllWb3NA0U2y)}b+n9~QdzXi4PckU*oC=yFNVnI(+8DRQ(u_)O95p4gJz z70n=?>|&mn^p_Z-m#5~cPw3nPZ@PHgiWLc>#6!8Yfd^T|D=aPRVPh3Fvd8ut`^V7k z+MQMDuW5P(=sP+*1ZLrO;?J|EQ&KJ`Cld7tkk6+E%srNStV^jAk_-nTl3jT}K7yD* z&}Y5352(-oZ&m+UCWWe6tl5psT^s_%R`1}XxsuvOq2gLGh>-m_Q$37!nSRRY{!hD+ z&2KBl0MwlSYISAatovJ7l_j9o>bMS_8UwPkyH%&KTivel+bBRciU{hMHpq`jU7U&d zUPqM8xCB%V&~u&?X*Yk(`ca{aTTD4{V+qal*xteP`x$AB$o9(VdSMUw8BjS7NI@TxN{~b7VDVS zfjpx{wMBIS4b$coGwRcPfY~-A;OvrrcUikBM_>Ox&-qntHeiI`H%h`)27wtgQunY^p2w;_= z4c~uA?f6ZO{xzGz)<04Q8V7tUHrf$DO|(FPe}w<$50UJR1wAM71=W zbpH=Zk!wFlYiAs86&0`3W^U@ZDDU9l0X5%HNV6S^qGR#!uTg|*`N zp<;4A>FhDpuNlRIOuV~5H9Pc<_sS%XZ<|Gt^eM#*7of1OL{}pcBV$yz zxb2=^V~ZKF{vTlvF{DgGKQlz zqTO)=f1d8igyPJcWj6K^sI)}SPqNXpC$n$SNXg<=!>ieJ>JyQz^=m<%YBkPtNGQIJ zd_Oapgok`3S=5;@hyxJGpEy?zLN)n}wV*hg9 z$P1SBUx#J*ZWvD7f-|;!Rr3Q+CIW5|mz*Yk4}Jj>!=>Ho=<|HKiDJ>KbJ~OYocwy} z?nn20m6}=tcbU;N;yL99JD3g5Q30mCyHk1McM!8r8iGrt^FD>Whby{|m*~OPUkEM% zT$Hy--!=&o(WYjNLo;gFSg-?Pm;se{n1~azb}k20%XVnS$lv(d zc+C0}&jij@Z79bZy0=3s9|2l1`J3?VkO_ZxgmLQK?!ic z7*9vQ0&a^*W%W-rYQC=63|vDbTZoDa(5iu6Q2W< z=qYfv{^-hU|2afA+8OXQi$VJ%i(T!$-&iG}RXhMT{MGka>On3GA3Ck;x1%}Jckxch z0V(}rw<8tj<-l1&@AlyxxKe2@DhN9fjAKR`AE>TzC^dQ#W~eoX4&bT=^k5&oIB|2I zn|gA&y~Xy+U>MUHG;k#jJ)`IrydqdU{UrqMu;CR&c;hZ~O_YM=9C^nm785=IYXKIQ zAnu`IZdmDJaozgZ1i@FM445JK_*Zl+VXn^u-=&tZ!e~qD1h54Y(xkwsYxDFN+QbCw z-+-QDssg!U<+62H=vbc#+u9JbTwp2wuNWM>OUZw$c2vo)TK9h4B=A(qcP;g4*uS&H zz>WfZYbgiKAGC?AWEqc(8CG22Oz8ochC~_%vEnuUegxnBROr@ip%l=GD9TR(>-U=9h&oQ%Sto6)(GpHDhoB3&62HivY2-Rybp_!Cyxos!yO6hV)Ebpqhgw zxldGmk~u(ka5v>BHF8LnlnC4taTnq8$lSv@2v3Y-oV3V!ol`8BRt@YQGElh0quj#ek;4xfqW)zRzLC{&k*Wx# zOHwiFCb%%vQLoSzQM9%vg84~lU~kZ6xZKCcCzdF9Y81}vWqWxf`C$({u?j-eZYAjD zL-(0&a&v*8HA*k$FyCjo`TZC47Mhn*BuI$OjfD`oZ}#-m>@V~4NkP>9K&&M33J5@* zldx=F!Qi<4zT&)Bh#e`x?O<0_oxQ}T&kx^m(aqvQr!cw*so2<>+4~=0?It3BTr)uT~H}!i3(Ff)k4hB8sW&<=E-P5O#7H@!Ly=) z+(4OOqkm$X!N)vH$g1sq8f((-!wk1G(Gj_v@76>6M-AXhWACT+bmo8eC*$GxZ35Kh zdvQ@qW|E^i8T%BSrinM=2XhK{UjQvV8lvqZ?x5eleW9kdu%GavapnNu#eQmxfJcvA zQp3w`EzSvfQe7mjBz`f2r>*)srl}A#0jEuuC2?hU$^3S%oy38Dop!p3`sb?m!^HFj zn!r!|!yp)=kcUpir^t+z`Ok27yxkN8TgR-zB1@t6CA)xdj4_W?WzkoHtub^f?WL#2 zLOg-hP>k0B+zp`2hQ1i?{vwII4;LQU`yGU!XoyvF$}=ouqij^3e|W z=fHq;sJyfYCf`@}dJ821PR`hd9EQ17Br2#{^)xo>r-fj})wlIo8oyVhm#S0AI*V%J zxxA&XNKnima<_NBt%|JAET#YKRJF8kV4E zj5q3tK(6mSiv$YnNf4ZurJ(Vo&*n4@fo-d!Og5!2{^HfT_X$TsW3zsBr`UvK5hVZj z`8|)ju5-O-=rD1J)=3HsV2006V^8c^=8ygy>V}6|`+Qi`{$IC`nuJOfObF33xLCWf z2bG6v4#}IT;j<;(NxJMBQgjz0^^o6n z${7A*)3}J~IXq6H(j~=%B8>tw-6=I{J?$WHSQ%NuNoV6 ztU#;O!*RQq)Y!dh9`@7;n*}UdbA~I<)5B2HQ(hD~GMcu8pctq7*6{9dLV$?rYx4@q zkv?8QyJIv@acDf@9}V4yH{xbvbR(`DEJp-liSFJ_?t2ay${Innm==U?t5%y9U++kdX1Oe|=yl=YZx+0fszpZv&q*pL(;L*vwlbIO&D8saCTcud z+!dZ&4?7mbymzq88zTy*0-*Zuj5__fy#?djo#j9gM6#NFKtt+rQnBTg`={s^vNb7% zbWziS7dN^+aU)4QVBjdN@#=Q}3DXBt4ArN*3=&q`S6y)zWd(QbJfqpkusgApS{{6= zG4MHlmsB>XrH48f=+n0%434C10t`)HPz|ytwP%xjz}Zu7~Se z5V2cwPh}(e z=is7@p#FO(G2B0tC?>Ey{>!QL*6;9@f92@V2_|c7v%J?-f(%&6)77w{?A4bOt4YhV z#%g{b>(*)c&YMH4V$4YcFH%F1_#u}MXEd+44`dd*$I9iO-Dzh!t@q5{dYoQP3bg)# zzk~bH1=Rm40bow&5~8g>ren7W4O9!vvKtP}Y66OdI$hO<5Wq)tQE)giw3H8pj}RB- zLo|v&JuZI5tzVpZz2u^|R6UADMd&7&b|X=i1J+~K%9qmJ#JYiqR@|kL5nV!(agu-D zQ(6K*^Z#AzPc*rhMt6|ki`n#tEhpi$bSPm|;&RygFI?Yg4b{H>Cl3&|#byXQk_xps z!!Ew(HKnndp|+<|5_fN9IIVQ1S8Zb|%Bb*Ka@Di=u}N0=8fTIrnbBywXkX2%zg= zdN7f>m;2K!les`w1I|mA%nchBOnau-4Z0mzLF182dkJzsB5;2~nAPYTksk5`c^so` z(LFnlui8765Y*Rt_gntF=HFyAzXbGbxO>l-bykj|A2yhRnX}vPk`xojAb3<%!V>rP zCxgaVHD1x+|XoSuq zNyP{Wr9ON}{c||+tXm*8#N5FJ^UtOH6qyoL4+LU6**_hKs4^A993ftEM~tG$cKb8X zl~FC-*if!3#ciX49!T@~my{EMs?y5uP@d9I$FsH6p&L0U`^a z4GA#s_tp>^sAfX#nKR7;HYu1=?8%$6Z`|Kw$CQq(RvTBKrm7-)A=O25@gH?U4NcVF5JxjGv z*13z$`sy|aN_^NeiUazJr!M-BX~dIF_BTq-?Ix{5*r*r9m?x37Is?feYI%v`d>H^0 zn>F?-#pi#%&=Ftr9HHCnRGAUY7b|<}#dhdCJz$+=RYDphFWOVovP${+<0vEwpPH%9 zw<{;(_#H^2#3ed{-|aXFPK0i{Fn{=5bzxFgoh_;1c2R@!ongwQ^fNT?l5&ruD?<3r z$f~>%#x*@_)#y-QFFc9x6${UPJeIzMsQ!}YjvEYLrOYoYkEEb^slTV7CUf-8j%3;j zRckUSx*!<6@Ugo_9nKx@Mh`7m>GGE@XB*YhdO2!=z1hl$3G89hx0Vo{te#HjxqsSr zUtVsn9(Z^vk`OSmx}l+^v2+@ziu&-#S%{}CIVrLISZklZZ>}7r_p+Lnc==!Z825Ob z@S{6BQ&18qv_UxYjtRh5*|bFA#3wdJd|D=_X2WV{p`bUyNoCJ(lIN8kjvDoK0Q~F+&mSM-~Nv(H0d%41h!o2mqH^2ZbI}b$H{`HbqZaw=Zy< zsd-x7#fAd#Rn|LnRIn$xzHJ^JRHc%+Wm$$?m_)4e)JJ#WX~BC1NlGA!jW{$c-%^BW zJaw``TeZ+^yl-xAYH{Fgu2+G&KOqkCJ5g8grAK6euP+xz56z zvI5}T5pjJru*oTh6QyUlf%h{;wycj)-rVl^@B^V(j6aaZgPTuXVEC;eUCLgfi}|z} z5nFG)b!0hm@bW?5c}>4BgfySxt;4h1dg>yI@0)T#AaNgvK`E|AQ|p+2u(Z-l9cex0tpePhNF2`FLc$yrdN0pL@SNV6qujFZg<)s__yT>XOw{B0~-Mn54-@RsMCx zZy6V4@2;dLx4=3@ul3Hmx9E33m>{!crg!$%PaQLepBq-X^oLP8V4 zLV2sY3?JC1+(z^7TO9JXn5NX+x^rv+@@?Q?kI~qf2a`{5gaYbjR)5^N?vu@#)w#fA z>JuIwy*Q*bG!f(jV37p}gS%iD_<@y%Y4PTZKHa;`00xyL!Z;lZ>*HHgQ;Td-<%OLi zR~E|_isC|d#9{Lg*5QkVWnQ~u%e@c1E1zk7^19-9T(E$mLp-m#(bQ7z2~aLOIXe-@ z*#k0C1j0rXfKOX*YB9dmeTIS5G51kxTPE6LnLQ5re1*cWh*s9p z&KqHGt_CUQ0om!!Ug{O21b41NpOP3wB^f*1!smFVZILfud`1C{xmJ&>j5+#n=aPzW zlW;g5nl1pxRPxKe5HO_V$b^#?qG(Vc^FMX|A14ai#~7RnrbXR+;N+qQZ0Qao%A?NHf+)f*7g3%SLRR#ZWD{~*HdM-1O^UN3M|$2c zh7Suu2~(w#ZRbrpZM4=)yj>Oqp7?i53&(8_;I0$=AAhRh+g@Qt zmMPs!x|aU;*;xBc5$k)48T6?$_9{HDI}6GvO;lCVKq!x@Wp~dlDVWn%GZOZl>6y?M zur2EXGPTgQ7ai>r{bAn_{9uLFG=xCI1-A|{Kyt^Tm~rG(dfs0QIQUVW5Nw8hpNvkx za?8%5`|NBFL1Pt9zP~hEjHHVvkOkSxp&|{v?SKKknS>iHZz;+}#)VRKk%!DGjasKY z%6=^)NVhG=q)S6inY(&)*~@XjLe4A+F4#=$Nub~%o}S#~4omKAtWO8FWqN%fFbtt_ z>yLw}(D0`^LVvVlGCyx9q$Som$%WD2Xku5Wc3FBLeTq`*aO?w2+#z6whA>l(^4f;p(AFxfl#4-VO(-O*-f zQ=!-E&z{yj(dbA^x*^@Gen`FJ5~&wly>kESl7cTZ8_nS7YoP;&F4|Du_tKAFt!35U z*`n$XNlt1nR#8|OLDQTUPAxrImYTSPp48f@3!XbTL9HV6M_=U3?Qr`FGnYq+YYRzw zUZUarYODm~u4XI8sn(Wx;~K*ybS`2NQF9#kxj8zq2^Um^;hnvSC09 z$(&XOa-w-EW(}e+^scPCXU=mkIfkF2AAGg6ecU1PK_GydzIX)ZGN>wqkJ`~gQz5Jt zH(hZa07RTyx519sZfPKze`lLTMZ`R$B2&}0nu9jUYgVsYu<^i$UFJ!aAVEJt(4{pQ zdTGGR0jo6J4R-~?x(Ql3E;>6B!x1h4U{(n3uoYa>s*S9vR^xCq!lxyvJ=tm+$YT!w ze4Hj86XPS};bso^n$$accQUu`>uJ3dj~Zyw^^I^~_G&;hQDEmJJU(F@L-xDU1i9qn z1!_0omO4u7?l5Q7p9Xu0oqlsdwtLZMK%5_aY=y&Cn3H>Z+?4N|^}Z#}i$%lu7{hD~ z?FJvA2R@~pQuyRf1ZowE^^kD$<{8Tp%U}8;$$yw;OIi8CBDwt^7o!H|@-|AdE4Bq0 z9gLvQVH&S}@%F66XKP5{*aG3=S?b;6l6w!p5Opy`4l+=1YbzH7Yjk_4^`0re6;`l| zoPe1V0=KxCP0>K@Q{G!OXbRiuIUUf}Dd4boE*?Mt?^!$t+vt)DhNz6@Y{4my(#Q??%l?X)`FE~7) z**D?R9G)#TKV6KjV1XKHV1L&3q7nb;xeQywG`nqxdUOB&0IxJTASkP)< zTCu+mo^R5xH|@C6YIzsEA`GUMU1j)%Qb=&6&rSbB@W?tVf0phWSLjrS8h;;Nkij6l ztbJOsm%b3YZ!_o$l)8vCrMY=K#c0J?`I}Scs z?>}m)=T7W2`Kj>9H!X|FP2eI{*0n3S&PUTOc^ADK6v(BOxFoc+vJueuhD`6Q#no_x zQNjf#V15#wPGe}bVh=S>I;*vrtW6rOsN7Er%gMrL8L@K`j+3q#mZCdnl9C0uDb0C>5ylP`&O$^qr?;Zg+!1zC z!R848G5P68b!$#lcDaF_LvIAJJBiTgfH~bWj#YG+rCtQJAa0RyVsXu@@}a?$6QCl(%r%nF>p}+!CnYgOrQSF9Fe-UT-~*zD{mq=H zDPP24t)GK0`*j{^>((s~^hE_z$AvN+0mhzoJhfT@0aAxC0m(^6$Hca~_B=~cveo6S zusdN_d938O3+&LiM{a%K{!tiqjulun;E(@N9S9{J4pulrBh6DYV1OaJu<CAVq>%uS-)~&BspRmg`D4Uv|IX&NS zuU9FcRX{gz@)zAX=rV$31HyboH4K*enWGVG^8Tr3|GY`ZmPS0EmKb3gaxSojJwBP- zeI?dNgK-V?1pcwCqDIwT9&8b?Ds%uCe^jdRn=8A}?u2WG<(XOxwN`YSW z(EIIGQ2qxDT8J)=?~rbO^o5Jj87C~}`o9~9Ztl?ef*j_H$rQEbl|y$HKALCtz9SbwS~%_Jc-zivjZG33ALH7Fp;|Tr1$fq5FVc` ze4~SH97XPGj3K(fU^%q4iQ=1P>X+0qe28kQ)Fv@u+k;U@8^Uh) z>q3@~Jr|_iz&l~*LWUg_a&W4!rqV%1@^Z-v(05&LM4s%_b+A(UhV>$?qQS}?-6*>| zsj!0FU%=T^#Y#{JUkv9o^)46(hC02w-KC=(on4r~zD0hO<7_NaOb z*{BBpJYnbTf$hWMWLbn-I2w<9e#=+*jPgo>|2_>BZCe^l>XY81O_UhXADUKyE(+OyL4U|Ih7rAlVxUqnkh-2xT(2DjZF?2!#knYp+;&gRn8YCgLBr>cm;WveT*58H9}~U(~GM6kC?L zx_MK_>_B32C$g+MdaRADqF_ay;{}~6cz*#idLD;Gp!H-6RO+!1EgUqd%HDH@vyJ>Y#{%KSAFv2jv7(ve{uOq0CQnJq}Is9{z^LY*%=XEa3)r5K^cS#Z-k|B zLdxj5O3^JHyItpOqxrji_S4qlh4)Hs{c^3qqAK!ba7bj=CVT(SAhWLn-&QcwvG1Q4 zw7z~3Ju$?Rm1t|!D8aFmA#ET_&WBoH13dUvN<{kXv6iuC7@bJRQSD;HaT@D%H#DnN z08c-w3>x1bDCOKoyU?~!=*Jk9ufNx=%uCF)o+>Urq`QakFoFhMzRR}2V8wH0~{U8Xp;Z z4+s@TVw9h&>?hF>2f>c}e#uV2>9qzfSZ)&}Vd~4GceL>-DX?zs`4K}XO!}C6My6c6 zi^Z78BaUw&GMnR)+>rkuYa*GSCua1#%P$$lDNM;L$5yt!-(~tpLnu2LE-Dd58eJ)} zH=+RBq_k>4Xd8CF9&9%YAJ+>hx)2ZakKl-GAIYQ1LP+b$v=~(jr3)Pi>D#%o2yod0 zc@^NVS*I+>r+F%1NcGNkvT!JeES^i>g&Z;Xzq&|7qPLN3UE};RDc_2zEl7E_lIqsbM{~ zrkeAI=L2Anlk0g7`rRbH0v<`8@tSSd^wc4Wsu=O0AaNW3%%-W0Vt^a(nP~VxuzoEG z-|T|4Vy9SNC*mD*CSn}pgtE?hF^W5r7)L+fqe=W|JULBfRaUMFDHSdFIn8D$VRhV( zB73o(S-JUqpF(+~rGp*`Y2^%;x2<`tL_$(xdL(gpt^XiHM+pCX1SJ+j(S4ld@GAqC zlc?`0T$C6gmBa`Sklqytn|)xzVeyZi`3-ch&v6Jd%i)tn4roSGgznlXb|{8lJm0U) zZelJ~lB-5_Si91BY2{@m@p*SQ%15DWVi0+pn^2~EWsG>xR1rC3EsLU9JMx5-Kt!sZ zMnqr`f|pn^`7c5EhG%`F#!=iI5q8tIRaPBy6{siFN_YPAGE>^P6yyzlcb8e{6)bG| zsN!{#gHeDSZW(X+4gw-0G%D+#kgZUKg9g^mMj#67PzX3jE+OoVtgoB(Sd?XFlS>pw zsjg72BUhM#)-v$-&QJ?vpPdWpe$Po@mkB1!AC+_LuDiTZf#a@*%aZd=57w5^O=J>h zshlCu3<;_Yo{yPO3>~f2@^^`Fo5$QC>>foyph)^mf~ci!X^c||CfRVyVsobiaoTV4 z_<#w&Q#HthUXA{fK18{ouwS{4fe1*kRF(g8q(u1_5)OAG0CRIs6T~)sbA={gkW(N6 z>PCZ#^DT1QIXcw#rur{yH;~KV3P4&MR}9_@MEkN+SREA9tN(%(9`n*U;Cw z9CIm0KVQp2<1=rF8Td7TvcDm$yBT?B+<@35#n*t; z-zAr$j#d^`CQTL7CnH!%TdvtaLcG^+$rDwE7UK&s zX`4c|%|HftQQEnGQLG|JpIMaKu0<6!b1cc5>5O_dPWc~|b&kyGNQ>QOFkwArp_~(p8N#_kc2rbh9=t30tl+F@7$q|wLeNB-CQ2}qr zw~}@I`XWhWJ0gn-RcM^7WfDQi@OZ0$BAUz2RKXO;M#(!v-%t z5e{P7GIdiyUZC()Q$>EB0@#8#DMUGIy9Yqj1ce5;p%di85Wka@ zyI`6>M<}|5ygN)u)k? zwSS^4{ho3bR3O&^h3~3unAs^WF82=qb_tMOh`X6E#znUYT{IK!icr%La9Pm)8SoTlG zkg@9q%-pQd{Hv;j9~)(YCzJ`Ij-*_M?Yro`7}P4QSw=-V7i|u93G0}_xt(%(*eCt@V5pB5%((LCS$-3% zDzk*_{VJtUljr)?-RB^yBj!=YR+V6A_m>+VOR$(Y`vBy2?`&533t%A-mdX}!nRNO4 zEqR4C1uG+@v48TIgSlGG^;F;xs*t1Yyf4`!{^Xcv^A|rwb6tI6MLNAup)8N*#2gY; zoNJ2DQN%n)B6-z_V?P8-$!YLEuDAW`b7-F#Ii`@5OGZDJrrm_X1;G(!6oZ)t)i7K@ zS|VO~Bd#>ZW?TGWN(zXJX?PcePD2Z-$KkgwE+uadwwe+>VtI_+Bnrp`$waT)4B|q`cO?Ustv%{?OAeJzp#LqXBDtgX(5n^d z5;zIOsm}TQ?*(u)Kv^g-H{2xJdoYJS*Qz|5WAXOmG+yW|yhtS(ME8#ieXVf@OE$!` z*Vd9tKYM`ZJR3vj=Wt%NK^5FL{ybN|TPc;sSS53Ix<4?dvt$9>i3t3(BzLWKMF|e+ z9~cJp4_4H)X@4~fZ2S^Rj=b-Cp9moI&(CJmiXGfm<7t1SN!rWCwTlVjf+Q#TfZj{C zk!(%tnoCO0oFxG;yqAGC*F;F{oRFGp`c`gr!(M@BZg>vE{lptXgj_#u0M@h?8s zjhEs*v?3t2jx6=ugaL|ch^5+Q_D0TzZC%U)5XrHaH}Fdu*j}FBWN}ft`iwh|Qo;Bt zFpWmDu29kws6ZCdG5aEK2%RR1bWkZPtVX|^0&G@43J0o_wFICIjvjWQ-kodNnD1a= zZX=V|ct;pb?QegyB86DGbh>(eZPjrZ5}iF##4g%)SE9$2B-)n^68kqk1$ao{_lv!- z<|HfDk=-yn0SlVrsuJVU=eT}MXkD?+1zEck<{n#ms}RhQ2o?%-hMAoRb8$V_{+<;#s)fEIFAhdovMzw2CE%s_0S|10_`}KYa~<- zR>a%S%TF{#FU71EH+&E%TMG_KSN|YQw2z`K1Lp(lZ+DQck@G^E`t;@aqDNx; zQR<{urlp=&H?tL#-IE3P?k25As5}SbnQR$lhVL@HQKL8Ycxz+Xn;ijeX;zz;WX*}@ z`+Gbxc(kBM88sNrUY~aP)w_1H{XlV_(*y+9;#2<7R-M_|Xu*w;&H`mFqXmbdwbGd|*O*r>_J% zwJmzu(?G-Mk|4f%{36nBTz*+BKphBL9*Q_OF7krd2#$uB+|l}kIqSl1FF=p7N_Zg( zD2`>ZodkO;xrdigOnKFkfHW>$3FRCbKp;F29~XOG6{Qc5E;+C^YckM16S^Lkw57tk z2SfQE=Bg!?&B`bv1&tTW1C@h1Gc;ag6ven2nDoGJ>Lh4V%0jGWx^U7?x1DN^J{%|+ z%w+Gex51cBw&5X`>y~BBwwuZ-Evg2%qA7VZvE^C=(K^MWJmd5I zpYGVN5O}cr4LirS(~QT)dWc0OP??1eY4p z%`UrpFH%MKMOpkaH1d)ruOG*-v)6Zv>h7r{`sxVp@Jctr4S@YBlCfhyTTwjDPPXWX zf+fK7frR1h64+CT7WWsDt#8>ztDgPA_Q>5@zA#_xDGa4>mV|-%AP_2g`({&l{y*IQ zp_fVO3;7{7Sk?0O?EbtZw1S{{efdjFFu2b!g5=>sCUSZv>@hAth$+RW-* zE~L3+Gch|QYb>?6hMm^ZyQ;V)5FJkoGVAz$fYMU9$ANuW#``EOub1NXodLn)sWbY7 zc7eXFG-UDTCC2uX!}*%2ANUHlR7OM8Ey@`;$HG5`RaGFSr9+k38fko^U-h8Ht9ebQ z25UBmlA)^oQOw1MZC_mgQL-R>=@hE(;!GPeIdQ?{6j7;khy5<$dgZkjpC4l;{4F#QArP7zbibd8OE`aXgafQQa}I_gN=9LI!G^ z?pRQzLE}=|_~AW&n&O^cX0w@B*}NZ-t%CWoo7g7hn`dzT_O|`*=W0mzmbJb*nb@oM zkVXgs?+V?;TeJ}Bq(aXtEvYTu`_G*EcXy_sr85SCYA67SXaLmhKXvT`OThkA(K=TnkovRZ@mxWBW%Bpjpnkmo3Mw1Y!Xx5O zxb=jkadwqj3v%W}B=h@d66g41>?NW1`cecNVI@Q6Nk%(Vp*!OlenejTS7*n|i(fk5glN}@$z<3cV? zz>3XOAAM8ikcbk&wU?Tge1hVmUp~+R^zY(e=TAfECFz#FqdE2*2HBZ;K!(-7R|D4Yfw!nTdWzI(ZK?m{_8*B){rzD5r3v zyE&2mUe{NPY0>P#nk>?B-9S)t+eI0I><7Y4N-r^UU!e`6VaE0rA)0Qj1;xx}U?hVb zA|5gChr;=;0(2j;{^q$)}Df#ydGGYL}X|)igHUY3#ue91%=e$&tm}jIPRi_~B>Ls`dDNBC61idby%;!6( zd!;V()e{0SH?W5#sP4F(e{BfGrK0_r^~>ai5_H#J`Uj*F<>g!}0-u1xvJGFVl!$6Q z;dFnt>gV+Q1E>3+fx@4dC>IsU;~c(NjPrmGpl5}vGE zncSh%iz{_E2#}>F+T)12NCOKzU(_}HM+*ld@Q-TL%FV0K+{FfcKGOH2-5RK9WQr+V zz#Lb+-_88StpOEn>q$@=3R9x5REa!<*CfQ{*ctxkI7ylMJMT8(m(JN^jK^Mb&E~I(kn#*2*#;(G^2uhexmiIwIp14 z6uk6k1r8}Xl&k7(Y42LQ4U-WFW&n7YLI#Et5ID(Qq->0DOb}bmu|Yp{1?tIA1gk4J z%7J`!udO{?)_9~7(1W7s9X&*WM%vbthL)~ce?ylo8Ic8@X)9BW0V3C zP^abzL)1$YI_VbzuMIdHu>=|KJ^t!*vm(khei^i&GfIQuBW<%tn`3J0co&$ndRHy7Io2_tEql`Rb=TA$#?fgWr zQ#kPj>BhlvcLbru1y0>_C|Y6YC=`G@;9GfuVcPGY-ZH!X*)4k+STGwOBJyh{E-t$+ zy7I6X_+zCd`oei$A$%gnycPkk5Jxj@Gupi-MqEg%)kCyn>SOv3#Qi}>G)ajivujmn z=@6Nb%8kpK=96duI%fXG6F-`(+Q84>&twDBxMmS%ttKOu$GH9@Jn>yj4VL@|!qI86 z4BX6d2k|kJx5xb<&@fFxPXD|Qgg9%-J@Z@%H=viJ=^;49x-|X)Zr(MO?`x^0nC2d@ z7*VR@8%ip%-gt~|tBF;ZJUg_1Bs(!n@empzj1##$;~h_2$j)QC1$^N2&J1~PXRtHr zq}j;xZO89u*%6|NY_^2AL@Z)nq0@PTLQQ(cTSv@nM?Sn22$+cL<`0R!mM>pk5ci7z zuoHXW1KB7JRIPi=1x0=_%apkgT2rHNl!5yNEdUGdg~N|Rj+68hp}W^;1=lJIiM#Dt zW+yZX|5h#ZV9}sM)@%3V9`POy0VZ@UoGFdo&sp4(V-d{mjnG;;7 zcG26UXeqac`C^;V)CFur_zBJg7PuzINT&qcVmd+Gp(xtE(hWe&iK6{KN5Kzue$<3^ z3pn*EkXSEuTYzP#z50YOc4iDQcs*7Z5Q{VhDxXtJ_2p|#83Y?vRNPGj4%pJ(81zu6 z%H{*rt7k3K-wQhtvP#+S9%t=bK&N1HeAGCS^%zb7J2b745Ef--!jhSje!5?gwUubq z)JfiLvL^DZ#oxmHfQaVb+5{=l!=mw+(s}8a1Xe`T=d6E*bmIX&s3s<^0%0{7YC|%8 z=C-Or;Sp3p%sNlPPe%X!G?e)rdXk@o&)eE*Gh|#XQbt84k!_WVOZO6Ja__IYYPznZ{4{Iox^xW^v|Z36zWTW;&BW6~)tY02tNbr9%Wf+lT*1ThkV5olaGx)hA2) zZ3~&8tlQ~Em9!ke3S?qed|2&^oemf}a!?!HhF5W+dTA3%M+!f%4r2a|VZ^25-q-WQ z>2|EaWRWjIOT24Y>z=mX%z63Y04j)TP6oMlN_U^i?QQgC1@(+q(TQQ)dAGQ7MgSSm zOt;rWS65F|M64Q~&64PP#rvBl-nmhA@ z5*mx1lO*0um#5#CLksGb<<>q#579-d12uu%i8RqA({)o7=P`U21Kt?XL}B|Wi{ z2!cXW+iXr$ers7of+$fSCHMk$gkxjb9up*0m1(2u9PqRK@f4Ngnc}-@DKrJS5CdmA~qj2PqFUds*5O&WixG z_XJmis`!F3j7`n~07G$^J4lISE6*j|*3z~vX!e2>;d@95+?%?fV=&l>YX%I8luU#l<2B?*5!zZWY6X`Gzlp=1$hfq^%&)0BsdJF?`!4i5MN)rlyfy9pP0PY8-MwsD%^TU`7i?xmB7HKtQ7tU8t+D@92vVF)euTL0dli>rBy(wG^>i9ie~0^hCo>yG`a zsH%@x&CONcsPxl)f-2=<>i`zU*AU^vW6uEGU=r8?Tt4TQ=PNo4-H*qy;S5%XYJlQf zd3O}gP?GzdKntWFX2r4Hak+?tqxf z+}^kEXg7IftssXmP(l=<4r9Ip>6fxJD6_9&$=z&dM_axxugZJxjgaAEQsMXy!c6uL z03Oul_=#fwyOp0w7&84tq57ScI0g`SQN(<~aC|-ooxD-gW66DVEKF>ypUo~Ld6gp6 zX1-(Y-bVspZy@>r&9=%>br~NDQ}8kC;6G`6kxBCdpI?8Omm-51Dg--6{}f=NZ>sa> zBRdFXPyhcN0RI1H0Q^to2Y>SI>iJr>K7j=Dx8sa@YKmJT>qTi6Yn$QFXh) zVY4^z5QRc(@d`=5peO{SJ9L2$U+jV}34j*w55-^;^Fb(8W-SUPPYgWA8bUcm@I|iW zons5pjax8Cijcqh!3EqqC{Zzuuw@DTb7dUAs;Kj3Wz#`@!PuO8*R#~wMwe^pEjjZy&>M>z^ce%`_Wr_z^Pb;uKdt~SOoci3+rr~|CtdYS zar(=FI*yi)&VkMW8IS@J1+KBMfHo0xk;rQ}z&~tAObm)cQ4nUCVot!kkC#kwoip*VAmWqGFZe3J@6Fx{<8wG*vv zend(5Ik<3iu~bNKLnGUKMFSAdPi0{57D5~b7KH&ksY9{t=MU@dskEzyL(AsyO+i_q zbI~b{1d7PDcyw(l&=5-5NQ4Nq@&J+pM9EQ$>`j~a;|%e(w!flK`{d1*DiidylK+$e^E1fe<{ z==hua>>J{EbKrO8CoBvF&ie~Wey?T_EClu=d^Di5kzR1SoYg!r#0Xwqp176QW1Q+z zWa*LZvhia=&}o2Hp${^@NR7a$RGWuNv*kA%sDy{nW?kQ*hC?lY2HcH!@p7g&&3kO%x6Dn*poz;qpAq zA)1B0kb9Gnw6Wr7qL95D8Xuc|Wk4NGyDR2@=q*+rRYOr~0stE_R^HcI#5CcQw!X@a z=(yYp+efuGx(4uNip#X%QUqqbz8bNAW)Qu-nl?tNpVrEEGOJFkQt6#FQs>f|_c}8e zr406@!2|af3O-yYpq(h?eihKHodvvGqV`kJ0xQ=uRZI(L+ohc{oOiJZ2Lv5f>4J z@-9N*SR+FV{G##Qpgcnv86HTPj|RKBfz~ltIalj3GbUA`JT?jqe)oIpvN~?{k7f#|;Db*9bnU1fgO?HaV^_fF6Ksf&$D$ zsk|IeM3vt9LMd!}FBYfjg0(YdPd{ku(6uVl5>lf)*-9>P4{=2|8-}RPa7#l?c7iKp zu$jujrss}2RXhm3NRFM|h21tUy3xGG{u9-uCPgh~2!xzr+P`l($!N~G7sK<>>c1}o zdp-v#6}_*XB*x2DK0bf+#U5l0y2~ks{WG)eK_`RiS@>T2e9xP}BiTHyeuYSq)bXA= zgFSL<%y}b8=5P#QP)Y*k6;7o(($X^F`a|`KdAg1q4iH^@FdUN+)q+47S5p5UYv&Xz zj1p|=ZQHhO>)*C*+qP}nwr$(CZ5#LG&dbdEJa$*o>7-5FYD~Ve2gQcLNS{9#M@4}E$9uV!iW^;nd0{s1POjEMIX^R`oRn|ev901VrB!he*7 zC+B+cA2-u{1T|e@du0_V*{a^bR+X}nvW1kleyeT<5`-LbjIO^`-D9!wi2_&2x3RfA zds`nYHZ5=@{zFIKNt@XX(G#X>Ki^c<@&Nt}f3^H$)^(d99vM;yn0;xOi+X>1S15W2 zL#aHg|D2CRuNWyPVJuo+WfEHeZJK!Fx612d4y`zuxNPKO_MDir`|$g6a`B6_NZ|z< z=hj2~#3;?IZlBV8b_-3 z@~U>p!g1MxR{n5!^++mmfJdF>(ExO>|5rnL%oC(n6z9_sC_5Ct1U|Hi4^A?q-mS^}bzuK1J1 zA?q)5JKe(6Ohq$u_ikoNg{Wi`#<`Kx1?7zS1DN108z@pp zfwydQB)@;1_5j*YK*4lLFTYUNIgsPesV zPL&D+!Lr5uG7PMaDy86zKQ;7-!Wu=Rq;Wp-&B(N-u0B;!Rtqy3EW!=vc5LkLT-QFe zgq%ZTFqjNw#PgjH$1S}1lwNWAdXq>IEsIR6l&1YqXnKAPP3=L(AFJLsOk_3;SheiX zbhu+#_Y?UrKip(=80;8apJ7`0t!yy@Z~v&6l}l~HYj9@#E%Kku3qY~mLd6F zhu&V3a|M`DteJP2&Fb|lpOX(5CcY@eXD`gbTGs~TGT^d7HzqG}yBUEyS#(!n+el3=EC2J?ka!nt@=HmqD|_wee?BmAvvYBrvw{GSUL*&mv!U`qn@AGz=||^T#05=kkl*Sju;p?#JKd(X8+jlQj{7X(%(scgt zFLSqmqT#H`Llogogpz2)_e7Kq0};6II@in1tc^&x#84<3{V}Xkx_Rj9k*5;w6Za>g zAU79clZwaETm%;VQSO!79Cw3%nIVQ*ZZ{LT9{H;WSe_q0ZBGqj#|D>rHwTqP75gQ* z4__8rYjkSUE;DCv>rM6pRutzcy}v?ixSYB^vsEtSHtTVAS~p64d>Hs(u4*}Ldo2u# z3#d)dCJqX5>aG-wj;Q{^P`Ycd16UX!k~(tb$Rnhf2Xl14;sh3Ou&{^)7PmBe$xO@49GaPIz>&}$TU z^X`Iwpx%&B7lErFsyUxHY%*B-lg=U;EoeAqC}zMqvq4XG5X$dKu{_Nk>9MChi(Ro8 z-E0%;qB*KQh?RWui<>jO2}63+(B{1D;FV$!vxpYEe9=5CAAR&qhN%BMhJumkb!lr|6{Y=BR z;bWm~`F1r3jy;hjcr-;OhU_o@SJlJ!4*d5I^In|j9_SkW%%arMx$U>7(SwRRf0$}l z#h;LRFAgZo**mapM~c`p@AuRWViqK}^Aymc&8Hv>AKk zUOCGyL+>_4K0H=zZxFt$h-MH`QcT1hiW>WYl5;#_|tyh#kX~_^KYjo zs}b^5C|0D-qp5pynCJF-<>U195dCBeJOupa#+SU3;`fXl+C5Dw+L`W}pTyOH0@cvN zX&%rHblDSyFY7$hAM)eaw`*G}W_gIz8UwDbP*EtqN?y}B4rBNFDsvgQ&7h)VMNsJj z8AFsFlVF9rqYl`o@>S>64+&nBmd1aINg~hSGRZ@Fv*%JD#As19pd61;UTx|Y8=mO_ z)3|e;VAK0h9gqI3RygL|cKhtNo5=^D^-)riItLv~owXxz=YS-}IcA9Y=EWybli(;a z@w4RC@VvU(aF=y_vtob!yyY2eV|3L}Ne_n?s%MC$1ZAkmh@cFNQPSfZfyD})WU#co6RLDy+f+klB+cFvqqHSHceUx}k!7vT$z3BG zPhJ8qZij_-ubTYQf=PkBvOZ+Rq}JLK)}~RNNw|3eM8N<<()#o;74h=-N+R$W?TSaL zV+27Mkk5Zfc$zD13f3zBU9-`AI>yKz89}z474uK1s8wPJf{VO@c0l3JI8ac|-nW0c zk_!$76yQW{29@{h@XxQuwsBV*zvHnod>!!V#tB38)dQ2HhH6_){Hc%BM&?jcqTt3G zMoc{wnmf@YX8+oJ-cma%g=-;Z+GdOnCHA^p4TQApp&{ww4nF!TYU&}$Y%g0YH!Ms_ zhazp3=VYW+Op1l9t(Efe=4@hGa>Ak{)!8?Fb$DUvmLL4m#ZlZ;1M#4uWtdX$B^>s~ z_mnK}lLiEuX`I%?F^5-x(059kV0m=|58{cL5N&*pi0$3vF3AA-3A>{&TRf{%V@)8v&cSAlI8%`g z;hRD;4J=x-!H!4WU9Wm|&F>+bw&NZ_r(=lw)|zz!AN?b58gljVDBk-OrudjQf<A^0nO;Fu8AP<|bszh5n_M;f2P-1;dH+8#Xg7pAX9aj#Qow@D&^YUiCiZg#vKHBFoUq@`8Q71cPV+m-3XL9r}md{E){un%kpF zUY>4C;K*qHtYZ}U6w$gOLsM(ivFOCkqj1pWO|NmvM*CW7O`hhMV~c;Ed&wGN=N3Uw z`#Hldw%FB%TBF1gC5dN=8zMw@j?43mRdreQeC0Y~Gl_)Ah zW8oCwjX%uCEza(Y+$J^HFdr04iFidxK1m6nC!qjz(|RE^F>e9LTdd?xU9f2YA_=vJ zymKs(x$^gf8HbN!rBvb*jz!vLxq$x_?+*WHMTiTLDA2K*7p)70DA2&hFYrAe93s*i5!b_A-9HasdZ%#b7gZeevL_b!i_0-Er3WQ+(?MXk%q(DU*0{2Z zl#9~T?Z#8F`@>t?F^%lhH8b$(O;Gg)oj?6vT0r6OsY@6m7m{B^oOWr$sZLwzLDPCH zfRttTVKn*ATb?K~^rx~A)oKKKwu}~t|3`}Z-vz+`wUyqF0I|`#5@Jq59Cv^He**u- z|5u>{0{~?9`TwNQHC`ai8$unhQsgJfKnQ;G_{#RU&w4EgBMW>ze+ng~!onV-!09Jx z58jy|o?Uu8>jyDNaowWr2vzolm$YZfUr1PgV$MXZbvyPyB}n6GMC$sLD`Kr?^@uR3 z9+i%+D0b_PXM}g|jhspn=F)2Wo%pB${7wWw3b|+F4d?l=gA!h*qgVVU1N`~vHGaqN z>2rlQs-!4-d0lm_d(ES_gNRc|QJem%iL^l;vA$|6rh~`L^Q(8ttod2 z5t0d~SgxoyoM_+J=Yu+mQPB#u0ST0HiYO3BZv0AeC z@Vijc_23mFestrBKY`CE-OF-5Fulq72%W{uVHc|=EnGY=5PpV7)oNAEoBix?6et>7 z+_b)X(g9?)N675PJ{C>i6sOgy{LN8G3G=RvJ(v89CronTYelx3#)7$KQ}{0Y{h(`% z^uF(+0W{NZje4@d0>?K}9}1IWq=+R-3}TgHndE`-N(BqstoeZzXyRwmD&1Y4Q_u&_ zViNSK?uk;Y?)-wSAYhMJT(|)|RusvpkDoWmSW#;q?8Of*QgT!#uU@G7)F-WFMr#&v zv{FA-Y31SN`4Mi@f$KXG<8n)TGmI>fhiBmyUA_d+<+;#J06d z^LOW{%4V?`p|khB4@Z!9Q!aUP{mTr@`l{?s4r91auHN!cq=8Q_DQ+x;fR7J|_JdkP z-r%`+Kg7WcG~eAZ$H5ljz)MoP*hIUSEXvvMrv~mt+2j!>16@@=Z*)T0@*QNBksH^( zhpL27ro^ls@(2xb^Ff>YCx3*ZCl*;i)HOL;QRDp1naU61v=23ah}sjOr3!$9+I*12 zB`jHRbCd{&J|WG-e8q9+PbrF^(L;7@ZH|aDszrZYSB#B;JZuUQ_W?7t?!mb-E#P2) zGTvqTMAd<@?!?Tqt%|v5PY9PY8)Pwg-vr6Th)sbzS3L&Dx1Zfb&5GcH2odZdfMPoZ zb)Xs$BYYC}qe9ffG0+g= zyx+O&&T>W-O2yY!E2{et5!yy{~rQj4F}k35z22o>et(qcvP z6*kYuVO8>s9Mj@8(N)Ivhb|t)NImD)ZxBba#TMOu3qe}k4O6lgvb=BC8<0Rv(yvcq zRQes9)@ZzM+Av~1jj&AU^~?9+y~-;j(2z;$fw^tt7~!gc}r7UhJ-jN zAaFeNu9mRlASsmsGffw{w!V;-x3r{ah85G4?ub&Y@3X1tM)lC z+HNP;<6GCufA10uA15mC{!9UyOO|`Ra6IGoBD00tQRLH`!wV~x?i(D!4W>Rlc(OQl z)@^Uato+O1oc^@S^=X@`FhVTvb>w+H2VSJ1g0qFm1}EO9AHkdBJ|T%axt^dC=WA%b zVP|In%T4mDFZ*eETp8^4;hNH;F-8!ENKg1SR%E5@bATCv$%41ELU5&u=rq3Gh;gKL zv;~^z>raf5bm4Yg324g>!RctGaLD?-v;Mh(fvD+1gsDumP2#*bt$+`ucC&Vlk>7zm zpc^$Yk2%0oxQZS5-^cDB#eYB&)%9WKBIn)}!GEHKBOJ^feG`9(7?dAOTl@>!kG5Qs zZm>qC!KF~}fpk2@MwG6>6&v1o1)?^guAqc>iK8%ZH_Lw-BBs4AEPUUB8(}Xh@@X%= ztB*Zn4f(y5SDWMGrBRN$9Q{mu0z#tLaUCqmK+_Xd{oSujtr#*~oVU$1(Qf9LSAM8~ zMv+J$v&IO6YV;ft?Ute-@O^y9H(KtCXykG$6{U`_6+uoLSMN{N0t7(S2)96Li|M-Xkc@pQ$E`ox~a;=uUc%^n+zlLy!Nv+szH zn%k%RBf)>NMx$nWp6u{$On=v0|MluoHx%($l8q&%ccEJSp(~Lin15gpDtR z_w4n%9b6GjyZ-A|mxb``vN^cZm;mq&bSx%zl#k%cO^AF4u!A&CK%dhjp`4hV(xS2X znJVfNboLyDY8=#p3jv%ht6)e|aVnFD72NC3o>f8j*j@EVq}s1)3UiJOxdzw(YbPEm z&t5x-`;mcBky5*SN47^_s33rK=)q(GNO|n%B?^?Uk6Vv^tK`-nnp6Ak*BUp{_*|Gz zWjn8-soES9liv0csLS~jyg5*iuT`jN*o?aKnorbbo4Gydov})`1VEC=wOzY-Ood7( z)cF}zpjM+xW?ybQu^W$|T%Xv@zhp z)v((WjR`50Ce@DsBY%qan~0qp&4Mm zSCbzzRQj}DZ@u3EZWz?tnhe^fWZ6sCvLU_rI*|}^-mhvXtFPJWQ2EIl%!gGAjF-{( zl0Ed@be$)SHmApNx=Vs``M&jQ%TsY4KCi{~*VL_AiM0NXEHTv{6rmdGKOOexa}i>@iL-Tt_r(*KzeCnyaLJL~+I-1-3x`}PO^d6m<^iNr6CUg{XSIIIuoay<3P zK`dNTPDeE(inEmA&Jcy(Jvh{dzjHFM<^qq=DIP+z7fex{l3(`2UUb*KH$3nN1;}0o z4b}Rm>@bM%wr?t437=F~HqN3*64%~yAmudJoWG(;Upirbj>=u_v4@o`_TvpVZu^Bd z9Jn|ogyA~21&FdK9PUU@;z-ELvm*Ky*0=FoTbHZ-%)qZd^O@gwQ=@j)nA4_f%$=33E46bu#u32zwe9vDzp}^|u3O zVAdDRvP}oQwg}OOJ4aj$hJ+^X2SPmML|dcrj9~KZjE>~1NdtVgP`*&Beh*~713YXpLG+p?0}t~#0hOv zU1`GJ(%7fon}+kh8=$}O+R9k~L7nGJ=wJtN@umH-z$N%W;FImH-p^=Eaj%bk)_y1$ z9VR35-<=)h3R(}U)wB~37(w^0XFrNPlXH1CdT36HS&C(Yj6c#@bx}pzO^L=dDOM*$ zlFu>`v}h|+8o`zTU?b8vRq4uh*AencTW?ig+9ZrxY3nzk;U?t^TcwMUB6QSc>t{vN zNt;IuTgjaE(s4)QZ*#4|vL@JY3>a60yu|%iZP$>9%r+bc6Kc3kNh!&o1Vw~9mU@h# zRsn4hf4W_X-nPTBa?LJicM(@ZO4XDKS8eAjmo_qPb7`C^g{RiJAV19xa@_7ZXS-iz z@$j4PxS89`3XyFFGfw&$&GO?t3P9%=!NR+du^a!9p^)^}TzJ{+qMxTCTKX{QhZv)Y zNd>l{gufLGTlE&v@O^(|A=_zlW1mRD`ePXh-f(JEr=I(K(#!|Obb*UW?2YFhg-g}j ze5ZHxV`OKUw;Bfd7|_73^!hn$)swi)7#*AcT;z=%crnqeg;FsyGzTjbB`lsc|0NdINJo@F5?VPFx0=kjDX5e zi|heSocXf2)OFVGk*7pUsKs!TTVsFGL;v$mJ~?X{hS%@v_G|LE+*;M2955#y=aP!* z0R1JuR{I0!FX)tFJ|7FP#B`Fq2?9(WMU=72Vq+2=0VRyWc-nt_fs6DoPpG9qGdbBu zbFvK%H~xHUD6DMsRt&E`%&})zt?RFzum-lpk!a%rnlX>wPJ*&1W3g7C5WHuDcHRhP z%XXY&-N#nhU|hww3$>NTE0?#JpRFee2Vy-2!9%)a$^MBbpVnJsvx?M(UeA~Rv0tlw!`eQ8M63LZ zgP!z%gLG7ccGy)l3t`(6k&`I3vef1ZrGMbu=cPV!vPpW?Lw+$aldv|ddW2MslREi< z8W}-?$}_cFSY7K}yy(+zV^eXC9XZ%?_osq8M`mWJ!W|OvFQI8zTN$kE4n+5wUx>(C zs{8ab$?7n~d!^OahbWg~7OCIB7@U7oF$YI+zE0-}22{?L2e6syL=-@nME@1B!g@7- z;-2#}GhL#U>vy+F!q09e|6aanHxxo@fGd+>d2ODo!9=`Xim9Y3nU_XY0se`-e=t0( z*&r0yT=D zyCnz}0sNrV%C%bS3sG`%m(imlm;EWMKOl9hOkjgHAnG;!&}3vZTd`g`K}>pkm3a3Ygu&;l~>8o(a^U)pjsj2;055qN<#& zDn%NXe#Sanz>sL!YQF6fgY^HmRVCduT@9Wzk<+4KH@jaotn`zY6SB4#*ll)0DB}Bp zlzsTwc~KlZtCt;c&0e&7UV7Y{7e2qUfE87a$-WyP-D;SBoZ9b!OFVfvu8K=X|3h=D zj^juPsQ@G7B9loSlOz~M9lHrW`|HbRqv78O&f3I?H!PSl=b?(eVos)>+w>1>A_BJA zb1{BRTWU)g6|z<;kE|mw*4s;Y;GF8h1466XC*HB~=f5tmg$ApR8My7Q1Aaw~vC zU=XV}z3ck^r#wI)CbmvI%9rj|k@x{a7ZjCUH)uL9JqRneg44K|2 zt3HSj@-@j#>BByAE`xr2$DpRb%wo^BT+2$i|D4q7vQ3XbNK2E4EulS%!{Ecr+Inq+daFqXGz z+SFskYz~M|pkVY8^PEF;`D0^Vv00Yc86NcsPm+MFYWEYNgnnX^qU0Fkqn5wb6~O^0 zH40~^dk}-$a}m&|mZc};+LOVaB!+QGnpOE)n+*`A9>JT`oKh%x+@wU8WIBf4$V4x_ z?@fdwFMfU*T+3_mC`-vX^BO?>kXU7f%lYTMp{TZm-U(xSE&R!t8o=+T)?Jyw=NCIQ zZ&Bl5Jw_9n7R|5HF4p=Ox6hvTUgjM^$%I^kWQ6Yohqqk)7_LxfLgvp>x>NfjobVJs z9`sS#w&WaGZ~`lhe#PmG}P)^AY*y@xsh{_*uc7V z!YreGB+Q`bY43W356Gh- zHYv=|NbI8m`~~3DqapGSJLGBHx1IoioJn+-pRMgf*SL5}Q=0|$&nQKmAdNJ+u3Ldc z)wk~lKDTP?F~GX(nb~RjuFqM((lk(QylbX&bTzIz6h>U1bc_gQhU)OGN4}kYrpF2s zFj;v^UM6LqBQ5e?N15r>%ECKU-$MDvMXXb}}6XXx$hK73g?aVHa^6$Vbx=>&+9gQmhu3szXz|YL{^}P&nJfZyl z0mLuCwdWAyA^Wwd5R=El(;DhJWbqz1Y+tu)jCLvnoEhvKU>q(~~fPj4I@!rxk$OR#qD(8BJ&HJ&s zJARbQTc57HqM%d9lH-9uBUf2msMOaDft76bw$u@fIYh$y7}o~+Y}17_IR*Rj(2*bR8&n=<@B?y!1hgm8W#g(O=-hI&CY4fJxfK`?0U*TERIT=h25Xo+kI&zoiCQJ1@ zg$qa`$2k%g*pz;Ouak++Vpiv+ynqIX#BurzKo#P9<1f3+yq&nAi(udGtTDTUSnuxO z0aw4%zsPyOlgJG`eOWnEke6B|Io~sA1guKbbPs-y&?xp<%+o2kEBXE(NbL>HX+#qx zb@xIrT8etU_nMe%1s=8QUYajuxG>v|dhqUtTBaem6~@$8EA^n*oP4T5|5kXmueOt6 zJhef9uAY0yH95UOABvVcdvO0)Qf4vlvoQK8sjKY|=lY+Tcy1(|#yE=p%5<$MQC4=4 zBwy{)%!-#lHd~k2yC+_YQw2pLGFmMl#`w zt;!z(vFa-4u@)t;MepPK>KHB!Qh2tvBEG+Wz>#Fae#UJN&T9gYb8>5-jmLwcvi=4f z@6;3&D~#A2Zt+nVhfBGFwce_Vh|kv@Mjo_|g9b88F(5DfD^+|+G5#fFjiU<)<~30K$>wFz9lR$U(5(F@7Vew5g9&xSMoZo9Zf67?{T4eM@%xbq8fqux@;_>`3HBvRfbTz7;wf!bz$qe|LY ztE@b`l`g)$a%;xG*EiIf|2Qg?n8@2^6NMY55Lax`3Qx4p`NL*p;vx|RUIN9!wyaA} z$AT|=;^LC0{Ji`-!_r*YxhBEezpy*Y+05Q1sQ9Nis6mjWD;taULIuxw~1bBmfEuDxJlxvA=?4FN%@PHOTkvlxQEgWO5F-0;yK5$KFug;l)Kahm;d{lk#i*(n zb$>Y27Q;?@dZDm?^p8Qe&fl0BUXv+j5TKpsxmUfXlMI);Pe3X(x?8rD<5j2metMY9 zee^@c5XF9WQjQLtS{gt~QczVhGe{W9e!{~!8UU2jj?X{t($yLwa#b~c&X=<F?xU%WOzdS23QI5*GoS5bAZ4N@$ZUf}98t?1&QdA` zl3=_h0}&W)ZRF*@iqWo#58`E`!QT$m`YCfoDr+<%T^2hn$-YB(LNWl>l+wvWd?8~~NyPV_=N>>s z7KD77;yQxRBr{MjhS{CrAEIS6X*j3F1cnHuyZ16TUM6$Pf@!MH3HI>BSdPiZp@$Gx zlU0nC!)LkBQv0z59iL4{B3f5Im`GE?EBgth!5KY%j_g4Y)Bmxvj*e8*F>U^F=TC=Q zxylUAg6pEQtG)K^MTFH&C~aRJ+Q!vYC~C;7uGv3DJjsMq9yWfyBQw@wi4-YCAV~P7 z;yoA)woL#!ts*+0;12N-PJE!PCN-J!{!4g=z?EGcCdsL3R-T9hLJXLSfh3+PH1=vr z_|wr6ljEUw0a5#9CPVqy=QX0FIjveJyUxv!BG9q-LVtsD@*3v#N2X1M;?YlHmOOft zC-up`#L-D;Cqp$k0~c?BAtHop)7MezpYjzLSr*NOJ}*Bm9c(8Q+-7010OIAu|DWBrg8E+h8Rq&?-9;o=MRy^G6A`I ztsY7cq}IHKi)p-D{7p%ZesDbhEwwV{3SQw7mkCQNL)*~a4&}v|RO_L1Hu$<7zMQ>ynrYg(#m zDWZ&NUF++jF^paJ;FYg|Z;DC_+K|NLnq)qJsD{R7>=>eB<|&nl1q|Gj;p=I(Ia5x% zMpL!&k$Eb)Tl-X_zX1TW%K?h_yuK77(SJNUpIwn1f?zFgg3TZ4gXn+5F25X75TI|V zmK@X8XMBT~t*r~2?Uqz@Tm-pVMoyKK*xDwz1}sFBRW#muJ%!| zv~p)Ydkk{uXfy=)82W-{aVQ1M4#^v~{^B9>I$>1xV!N-TTl_Zp5^;c`xKXcC(VMc! zY6ZC+;qHB$z*<`S_6_6ifE@aMv(#r6+4q?um`-)R+|aZM8emv^?n8|U z4dkPgoAW4z`ts#?r8E>1^x9;y(lQo+%JkdWM=F95$RR<{K!!t+*%`7j?&ilHIUU7v z$l{>9C*wmxRxz{>QV+tr2 zaEWApKDg?zZ3xU^=P*paRziz|Be|pf&%)2;#!8sHtryj`2HtWz2KAf}6=qNeCs8RX zaU11rC&qXPy?cqy%fxhGS*SKg=1Eal=+!>vUgh*o(29uG&*FH(67ecHFlF(!t!Scm zNHNZ50}CamO&;pqN%*%H3OcdmwS$2%n!Zz3{s=mZL~9P*bI+dAEq7NBtSG&sDfr?% zuKJdU^v#>GnD_m%R&zdmH42(S^YSQ>lfN?zd(T*-%^Kd%BdhFFP6fO|VCS%C0v+B9 zcWx3#RQLTmyWJ!ctU{h$A?+%(@d{O!6%rIcdm1;vXU*D8^}Zt<^YTWaq)co zkyLfQ-9RXe2-(IlxwyXX@V9kPa@A0&EX`Rhu#D`-eIT_G6;A<&>u?l-G*XYX#xeuVv|5NTJ(2rZD+cei)o-6=mzRDOO~y~toXEf4^cIyT zBY8tdJ|32!S$ILSLj}P>?xJO4<$>esJU+hCtT)(`TzOl#Hbym}1|~t8i|<^2%9q`G zi0ngJ->Sc8iUaCW1o4B*kR-2jJ2t$c9K<)xgicjR=sRo-*gfiG8z$Nf`8SG;GO<%8 z`6m70U$uneZ%3+>mxeR7?vd;#`|;(_3+yoI&8?Y~cJ7xU5n~(mdf&|o-P3MF-PM2g z$u4i!9PTIhFORzUt+-u4bL$LWr;F;1e5Mz{AS*;Q-CxB-VZ^{~!EJ(v;lM5}9d+z; z-^b=sm%ULgMZE_|TNp#hRZ{#AXTa#UDhob%YWiq5*5rSrUU}yJGXFsenz?oq{bUfK zneOZMsFvEe2h2&1QEr7Livl9+4y5CC)3F=Nr(;$9D)57vi`}|db79L67_<>+veAMD zY;z!Lg?p@bb8~WvNg)C?LaTJgh^b1SmlER%i+Ad7&nc!)HQ;zsq1Dr;Ia}P)n5G=J zjNrq>xfC??5+VJ3N_T%#XMSz&^XwCur`^OTn)Brs@8OZTH@GvR_%bZqDRImi05>0% z`stt+dIz;OXYmr4QWQwF_i#f=aF~?g%xOJ*FqZu6S77AsNbNbyUgc#Z56gtRTz=2) zh3YY_2C35#U~b%xgU`YMe&Voql5@;Gfg6oW_W7#S+fbEJNr>@h9gE^q|L_#u{DGX3 z8m#%l4id1h`-zOcKK7%q3K}B%4Qi{72 z6iA74hMQC-5;+q0jOpA>R;d`gYk|gGkbD=Q@1`8Q<&UWwFx}9ut3j+S0M2(q?SE@S z;9}oIha0-eZVAcSX)aLuV6eTMzlcL7&6LW&QaD{P6v+d)=JMpSI6OB;%+Zw)bYo5@ zFWeu=20T++#`!fiJ)X+aII+F@Ur{gS&7|x>U2v=QQRH((!!-qf%GBJ=XgjK^0BEl_ zWJI;PY(&|2VlQmQYGRjF5-u-1vmT@c!_^ulw)L66Qv=(!(G8q=GJ^@i;ph$xuT3Z) zbgiHr!oG9JcHuwF==6Pf<5f}4yufBXziYXD>X>dRB8)#D0E~5^;hddM0v|yM$fq@hnLb0 zXQPHW@te4Uguz51)+75EzRs>Vs3mnVYqtm;5mgTn_D`XLb0Hwl>7FZ6g8aR5H}bVu zsbLXB0ehe-R{F#n%jF}nn00V$%2cuV?W0Q$BCNA&K%aW=DOm-j|Y(E6ZEQxLBlLRj6mK#nsd zKmXX8J{J-%Fl~pM1ao5raVsGxSA`r*HLSNtqobWNr)w}7p~3HR&i&~sKBkQnIL~+Z zsEr7|M&irOPD|~dgtt|N3{5fLWc_g)rwxei{)s=^@HV#H59;v zINP?b`e|&M^`GA@2SvlZT$gr472QMS9b0~z+hZMvKd_*M7*MhV#l;`PLZ>6YG(?mF z{Ngq)Wx9{lC(GoWQ68oAFA_i(0lzAJuHTD%6}j0RS*qA-=lrl6_~&X%CDmKRK-Ib9N+qW6!FGZ8Jqe?O0gw}P_6SBkI!3(D#t zY3|A-)L^94lScxGjOgv-s!7_3fIRIxog6>WbSQQX7r`8@G1hWTV1TUF|2np!D_odq zp|J~D-&3B02MBYZhAmGS7H=0#oDNjkf2YOdL1DUCVzSvM&_=v*Ls;B6=36?HT#T?e z6O&t7Io1J2kzU4vrQ|Gw&Bh0Xzg9bY?l8`rI9ToP?wH&dY-cIBCQ0RxujODa^Am)f=ew4%|tzfGhy`0er6o0+7RKdQoh)=#nRD z!ONgnsfU=MmF{FI_*55OJPm(NuvM_LE7IWdjfhcjx&CehfOkU_B=z^;4*@h-kYFd3 zR&(X@pf)TI8J7gSwVs!)e)KTd2b&+RMRNS2+VdTFt)q;5U-|g@ohsm$NU)?A3eR$7 zr!ii?ro8&L~{bZOFyG2I2; zQ++R9+k^^SknY62F2OW-yNm-ca=%tTU2nangOuA6ObpW{Rg?90E+^5%>-dM&k?v{X zL==TghZmf8X@kn;;5;B%p%rV~hHwMLt}SvJhErDS3VNt9zRj9^$Xx(F4$p{D{8piog0D!n#D4X!YTD#61 zUdL?`XI~Ae_;YR7M%PtTgnY8>bb^{QPT#o~^}dRi#^++}_#V9Ir>w>E{Yq`|V+${V zben#G`lUx#Sv25rL{hqet%VUo3b$V|5HR8=Dz!DlM=J;bT1We~4^Q%L@ef|Wp9Ci% z7B`&Vx!F#|vpp`RXMJe83Su=+(tO?y*U=$&cCIL=)82d#=G9vN4l&V;QnzZV%Z|%$ zI8cMZ%8UOJ8$XDh$pw?pGdYMvUtw(?3!N~#n^<@XNaJ42a*5`x*>}DL%wf+7!SL^LXrFEZA#{1g+rO8oD#smc%sVu3eaUY)kxMqRt**k%_%k z?QB5qPYnmE9D_8B;&UtNDiI>anrIR)Z|g0&H(#4b;U=7XN~9_%;L?DX6SEdSfHC?H z+uJ2v?-cwtuwouR#dj_rshb!gkIWh=vZ6cnf@p^o-{6NJ)!6N9$7+vU)FOw-Xl`GE>n|knAGMm*~=B_=;1k!`t z!y}MVu`o?;iS%aik9MC1lGu(~z$JLMx|(LuB2}~e$uj@b!(+^8>w4qYQ3dUVq*6Q7 z*@$#-cS5CIdS@y|!m1C?KY;uqgR%Hn;oW2f28#PKZ@}{m zm*T5D_6Tbn+Q6UDB=e+N>;MiFDR-z94n^IkYUG<=>8#O~B1NolYcJbAB#fO9gJhnV|)AT9iyZTI}Z*j|e9 z6aT>h1*}g?v!yc**x_Bo6XG|?2D^{>sEfKx$-d1LVi>&pkx@Qqtig!Hr7oYRJ+3qc z`r~(dlwKU2A0(E5OtNk&UPZ;K^2;VRoKyOW&H!66#Zv3(v7eJ9alpPvSFiQ<^FSZe z(;rNKE{Pa1#-FJutxQP9bTP#i{xB0vwwYbd7V290FDOB@bYd*1OvR%cz=bYYh7NO* zEr5Fa0k*kfg5$EZ%J0CHx#8%FnW{tNh?)ED{<+imaueu!J)9L;snIx~PyiaXAse zj(la6VjqaWFI|$td6AEpZ6ofyeHMh0lHzaWUwl>)`H|e+@T7P(r~{=mdxfO z@pC`88pQ!IwDSSDrfb2gcaU>;hswt&Ho{XhveeKft|bNM17{|fxcVaRY)&GxH?cM2 z@RcD&C?^0+tV=2=VTH7g1M%DRxPJq3{sA)ERfCm1PDMu9`#CtBjw2$7q?(@k_iz@) zdBh?geBNy-twmlqK#oFXajM|_4*)Yj%)els4wJovt(VJQB61&QeucdQ$)Ou9KDy=-rM)(%YS2pV*yfDSfI1qTyWP!h>h zsa6zZyPmJee`v7zgE(-KL*Z-A-GUnXM{H8ki2$7P{pagCYh_(v1X=x7hGQ`AVL5I3 z^sJ;gI~#HYE$>V|>QEtsqGYhr=t;h`1C{3hqJXAOV0DSEE{b7>3%l=22+^=3!Q)#u zYSqC*3SFob+al%_2=U*3skY$%O2b!z$R6-tG;~w&lxzRA03=8306;Ot_nAy4d68UWnYFFT{1;%qsue#!*zmHOQaezNv=lJsD8u$d)wp`T z9i9<3$l%Qj9a01A+?95bp;Dcc+5GXm2VqtEhOg5tC2hfy`Eo@#&ij&Zb`~pa!PoBq zr!lbSfe_s!qzbnUJcEe~+Xm!lIH-%60F7#57M(i`KrlRz?%{OtC_1(3pgc=6zn0Hg z58|llXhUncquiWBtcW~}(e#U@KaJzv;VjhT<53|RGerbcz$51~b%k^R654AL#bd>~ zVJc~)Z;Pql@UdzGwzOR#!$@8On{f9}!<81Yb_{VDJOsdg}ipF1GxD_?8wy$vG#2Mtr!wRZC7WS2(c}f zi_?5<6l%#xSO8QHpZkjX1z_R z0ghvbT5`KH8jo)-MMfb$#GLb4>}JjxW-uz|^|K;u4rdjiJWV^E0JEk=v`poET~aC` zGhtj@n(rzE8c(?a@!4gIR;>->&HSR`Q)O?nz<;NCM&4}{9I!GOyyb~B zzq?!Ko`zTjOn zI)=cJ{F)*Ow{7!^$>Bz?H&QAMIGg~K{-Lq11O*&dODiyMjR`S_zE7gjX8!3PL-*T& z?Va%x?PNEwo~WP6-56XuHCl>Cz#Cmbo*WLK(3l24$oRei*AdN_=a>F@3v~P-d4Bpo zy&S9D{cenu3|XOZrw5H_>_5%pnu5J@`AGe+*g7>bfL03SJO&dds~_-d^P5ofA0Jx; zqaHG8;CO(u)oG7@WrhpqDvuu`RD`eR#4W|;Kf~$X5c5-ZU3wN=d|v94HB3F77d#nL z>>Gd1%~WLvtgv0ZQ%jXE>q`jK@&~1>Ck{31gNNx)h+0iy!|UM&j>rL%@+rk}tjo+M-Ws>=Q@p z0KImd-%eQz2_KkZKlT+P?tG@kyl>;f#fkia&Ftp!!2!3ax%UQ5dQQbH~)aZACQref`1v6@9D+Q44 zby7iekY3_tX=I+-k`AE4!(%@T#IX(#!bfXL6A*J&;K}i=yS!3b!>E0`NqhE(sbPHY zF}65cA7Umif2=?sDy0y|nV29J0%^xNYqQrQbvs zF0A%(-foX`lW$GrxyLD6-A}vF@MfuoB(x5K%6Z-nXKM$#Mm&?GUn&wt)miNiPXf2( z)1kz@-zip;gtG4X-3nS^tMZphMrAFm6}RH63=F`z3F(k^FBiSg;-=xhE`H?7@p5?# z-ny5?GQ}fX#Z8($iqIu4#D@CtbPyvDGw@`X8SE2g?oG}>+E(ejny<%@vqCY z(EJmVE4}+k%=HtViG+`HVjOb!^lw)zMHrlzbFU|rdd(-FhthFKTTF^^zBs<$)wN{n z3hY;rVvDIf<^Y!w_tfXkfbk&Gh4r70FVtgum8!pO=I@Ykj5B>9$7Zd2hL4!XyoUvK z-2zLs#;eXS=!S%#St;6u??b1DDatYO(1@Z6sSO^`qf15aD-_>`upa+!D_Qdaj#dP3 zhxnUX{&{V1Uq;Y$-;bx;XWszML7-(Z3DBXzg2Xm3+8ci2nP&;x;Zj-Toh|lGkK?pA z_c!9MtnwNIM!d8wUe>QiTIH8mvTfULt+!)) z_G@D$sk0xN^4zX4hTS0Dvs6jKHdzEXe->aTTCj7=Nm+7+qgHNRT$UdER~WKo9!3n$oZlm<0UGW0_Ztd zW-wHepzfDEvLmT=16)6s{+6o`FAiSLnQul#R)!-CAq%KA$W0yJpS})1_ZJ1v6NsxQ zYWjM|d(hbDg|kEUe2B0X#7`#=MHs3sYs*u7@(QRKqm(K5W`G0h;fgFmp$GJxih_lv z({NnCX*fK$nL%B$&}+&EO0S-+!UDN$bL3emR4erZtwg?B8d0!|3R3KF=*qO_Q0|#t z;`cvfCIn)3meiYBk{^h$3}e=OwIt$aM>NU({ME~li%#81x<{@6NlmMi!b6YA)weMB z*X!hqH5^?gK)Ee^w0`5XYGq9`Dt>tC(My1d5!Wije1NLkDf2$X>r&e08nOD`UX> zn?v|XWX(~r5_mjs_hs~uMicfRrWc1dNlGUz>eX(kKI2cxH1y?`|2|QVOhz>x0|(pC zv;bB1KWO`zXSCG~02EhSxE??tyQ>SkV3%eReS^iYqBuOwQ*D{Vi_a3f2#y#;D?Nh^UDLrN3V_u6{yD@4l<_b z%(M}HEaOx{V8f#e)J9&7T#SwOfQ3{akysNP39qfP-m3Mo&ox9ZU+bG`toih2J~rZP zHT)c(QnSGE1|vFDNx5p&WtrF}fe9nKFB^|pUYta&z7M05P*f@RbPhB(ZlJaVnAx~# zvRGZI3D~2jqGZRyYBBT~fWl5f&{^@JHw+OLB6LDu-hALtBWrZYx?UC7WSpcleFsU3 z;zqM%qWrCB)a$7dn$_4$C!lAs+IRK9@xl2df}O$q65{|Ty?~sV>5N=Z5SBE^b4bQ4 zg!<>Hv@^f&-usGT6kk=4y&?K&pzhRMknXMVRZ+PGwKsKI6zzM?^5b2N(uDS?Qb|xj z(lF>-S}SyO8T+R9!O={c*x*fsn8}D)0V&@4HpwaWNlMQHi*0 zBoT~DPbY{d~V(%#EKQJCKc4^FHOz#f`EVwW?HwzVWaUM6;fW_|iyC zDcEN;`RxtFEt`=2K};zizg}9Xy~0zW)+!q#BOVbiekjm?~Dx%|b>BnaPjdy1ufW zdwnrJ<^lKnSv%6R-r#z*F?~vnS4{@T8)bEM=FHW1gt-TgQJ}XdXQ|;i2brjx6Scja z^}~QBnMzWF42!QOEG}@!*B&W+uh~@i(u!!5U#*;rw+3|%lIL8e;wGlgGFQZ23R*R` zUo7pW;M`9)7UbsdopqHusEz&2eLZkKgJt|?iHHNeUEW(VjML5=9_aK4N@x~&AhRyL zUODeRSzm8^z>pJC;ptJ8hM*&XzK7 ze`lJzN$=1LLs99zWnY0DFHl&!$BWev3e_Xvje|x4 zV~~Qdppz<3ClKLX@i5H0S_G9c?t1*KjL8&rCVfM53S`+xehkmdy2c#j$UO69^8n+8 zl_3Zy$DaxYxhwf;g`2U-5~DblQF{2l!+8xnE}%?gK2cN^j=ONLud7XT-a^JTE0Z97 zhS$Su%^X%`AjQb8#NrPS8EtNWvXrzNY^ddc+~y}qpV%SikKfiX&k4S#W0l^h#nq4L zg>-2C(7ac1I`^SdT_w+!zh8PBSwj+Ua{b=92DMQ5dDP6Mh7*E~utrMcupJ^GOi>oU z_Trrulyg@LM9TheMQB>hk%{xxbURV}d(B6j2-&2jL@ z>PM~|l-QIbZ;m7D&>HE#z|$K9dqPujf0irfK5%hcbZuB7eJQa8-2h2tEnGJhdk%rj zwi~=rt$$fqTKoC;0*Rmhn5EzO%XN_pi(~%VVWoG5B*(0KN?MII1Ts+`oB6o|#KQjZLeN!4e>zTs7W}gDMPp2jPfr zO!c}Th@6d;E8!=Eq<+a9Z)Z?6dFtt&X*7m%gVb!#n+(>1Hz^a^cTSrJMz_qO7!l(08n;iJ= zZh`Zix9sUISk`#Ofy3nbTEpb}F~RWrdNBnhYOYHN1zAO&n%?qy;5qoHUZuDwmE=Oz zy$g94KE#oxB6J3JD{#0}c?i-ub^i_n1x!lD)tXGqqr`xxI&GZlYZXid=o$M^6hd24b zjqSjCC{4%sX=vcTERtN49T7lh z*yfBCyR=z5-=m3Q^38xe%NV3r`LYMYGqpP{#!r7CrIiC&g15WG*9CP`0A6xer&0@` zor5(wRYHoEV2y&8zfWH0)6mX4U-VVSlFeBbj|6W9y|1m7JOX;>g!Oa&mKD$#{+RHrKd`9z&nP2&bAFI0)-k1-k9V&s7 z@uri5?2VQ)71z5eGP$s+n4V=K~7S*eU1yLMtTSX=rNcIfhc9Vh|de=+C{rTjKgJ*6x6mTx=t_CA6-F( z$O)VSRO~8eSj!rg=iU(d*4gFX#;pB2ztoHrW7J~>rfO(1?@`N*@1Y77S4+<$BU+Uc zix%TmsEl+#KU(;3tl9=$dDIhhZGM(ml=o24T?deMQ2DY38BirfyGFH`puVB#orcMXc{n^vl zi+PSnSw_of$5*-yLP^g=C#a$43fdp`0D|5>`4J-uv zr2t1Bo8TWqV#)bsV45@+JMp>?3D{%PhA`mX+8qfKpmvxJx}AC90|O8p&Q}&yD&;i( z213%~mJNZLy%cqxbj2HZPhUQqeoMq_lY&yPa$`&9dlaWF&<7iUVU;6(nb1qBLj`5x zH9@bX#;MoxT0P#0U(vInKbZQ#&G!d56q9?qTyT%B+eh*UIG6CL{#{qNun;y*?U2cR z3bxP9Cv#v%zlGmAf;?fQ5}Oui*T}hvtS@&4(%A+yu)6rRSMaawhmK5QOo8%En?AVx z<7kr;vvC8*@V;oGiXEgh`4?3>Mr8m6tvPE^q1)AE$kE$nZ!E50AE<5yb4$XYauWPk zz0#jLxTOrfbXbD=#}x3Cd3FT@OSJU_$S$+LPo=9p9R%*&A_u@Ub8U=%t(>UAwLd6R z8Yf@MV1OgvCIH@I(*9KR0OdLrqH?*_-21KWzIZ-!a7n`~Q83^Yj6i7UrPNn9x!mJ% zL{G>>-ifq^e`>22_;K5@tf*ECnM>lyWByfeT@G(R8u zMfMDKhAP6k0M(atDwnD9F3?)bw21Ne#Jt zR<3DLFsd`7L7xv7(YMTJWIe^xuR-UW=_NZ%!s5>kqMS1tgO}#AmzQp>9@?j-Y6o&7 z5Rmvn8oXt%n{I*YM#UF=({jN1e$gSr=v5?3C{l-k*LE!?*`j~WJaSb-*C(nYBvtce z1?ik-U7q2O#Zh@P6Ml#JI?A#7KS7 z%ZZD-jON;?ZjYjdKqf7W#1hx&pMI+T<#^wnzM{kWQiZyZye;N?p2t3rF!o3!xiHQ~ zf8)le+6G|TU{pkCOL7+T)J{mM;fceg5PZ0OMrHOv4V?kVnEAx9-NP@jl~{!52K71g z4>Y=jrv2Uj6x-3dDGArX|3`3ZBQ2qt4xb9=!|@{g#D2vKvN;>PJSl8nRqk}hrsUv} z!voQ!MUn4T0n&CO(|LvqHma9ma5C}JpI4)xFBq?7RQw;5b@{YkFop%dhwwLcQ&%~X zztvqhQerQCvIxBNQI&Ha0HYH1vzyO*c_1+~hi6M0slEKq>6=I&zPAv~By~T~$p}wctE16g78zoM2Nd&I7r1Gke>WJD1SM6G>g(v}f&qVaa|#s_PcY3PW$< zw*@xk6kgG}Yt*A@kMutK(~1Kd3RY*z?=N%tAXZ}a0hvs*)iQpFoOG*3Z9_3wEAKQ zO!}@fg7xlPJxWs2JfXM)5vS0+{BDh5(oYMscbyfd@jMQA7IS6IqFv#ba zL;}Ss@L#zeUns)O11=2yKTE(S-C`YXfFSkN#|t>l^SUp1jYZnoW(x86q5=-qU3K*i zj+WN@4kD3QUhscm{AmOVhl|Gm>jXj*DnqOob|BCDKK>*R#0t1lL4fD#`UO8%s{Ql+ zhyQ8)7rFYrf_vxs1b(lgzx8{?WAuHsuannB^8MJam+n4OZh7LR4i4+W8SWXUHBYne06rC4HGo=N`lxRg@718MneO$R%{L9xSh13yOH40 zoQ+htfaJ2)LKbc=+t)CHOQwp0*Gb0B$bw4SFAZJ9e?Z(gmV_B5^V9HBobNty4-hs0*IJ*OtnWa55X86<;!@$DF$kc^K2%PJRB?pCW4}M2!*#jMIk=a?<)z z&vTEIR1Ha4<(eC2+e1Y5FGT`Q3h4#&K^V#`-Nf&rVGf+QyEyW z^Mx`2-af)Q#;5wKtu^?{+|TtR#Hqp73RX;=rJrn+AKqHrH>>lGI9Z;jip3Easr5EJ-Ca^{AB9LrycO`$7%Z9nSYQk}C6s|0AKPAS!29R1O9uqa< zR_Z^qHC8!gekLE=t4~H>Tu9ao`)YUSIKp*!js4-mviRVM^y>?t8x-NSMzIIm#UMQ_ zXJod|?bZf!XsbNZ0dLr?oioYa$UIf#IW~fZg-;*if>nSA_j6DeEt&FBx;)rHuAM1P zjk+{XhT+pHkuEr7=ZD4}Kj?{@x>Gy8AvmtlNM5TLiCjN=%yG)2bPTPUhVj9r1AA;p z>{kybX05zm@@xB3>yBL8TfSA&h#%@+pyCwDkP zIO;aXh}f}oxL)Lh3ooxjRZN7TjJB+$b9P6>{P=Rv>p{FZj)qx(!BeQPIA%s}LKNj& zV4ApFjN&m2`-OgmpAglHbR|P8aWH4%m_%F;^*%(8B_;idXV7_fUo)b0^aG+-BZv)? z{Z6ITI0~kb<0S{_zFu|t-wMLRq`gYf=oxiJe^$4_9mwADISIQJI@=-HKz46m8^d)> z<4bVgB{@5-DOIdy3kF&C;2I{P0%<5`dOk#H&tSGcF_ zJg8Neq?dbnXuoG`O(ZYiqzx!E{vCg}S&jsF&%9PH3I*%SA~E?bwnxlw_IS5x0W+ewky3>#kI3YQ^m!qK;?XDI8q%K|j6+@8?w5ALU>cYcx(`(CL9*z*K8EA9;2KAj*&TJABJTW|1G z5I!!T$Q9r#aPVN9&b)Qdh<{<>xqg^Mp?|gvd1eI6TEzh=ryL;iZ1l&l{{a)B6*8c@ zW(?h&5?#m%v?vcd9rox$$_pr=0*EYf;?Sl^AmkToq#sg<-G3^z2CH#TiP_1>_6 zc={Y=ZzC-*4sskP^VZB|z%N4Zf=Ps@5Lu`e(~xzj708u<5>4Fp+L2Mf_1ESK*UWv8 z!(3ab_C(x7(RQDFIbVpi*#};$3h(0-#P3ugWg2qy2^o)*x$3(hEJ?E#cI)|BV6&Zn{hzIBLUBJ3R_L#wf$R2GCBDF~K;O)obM4J=3sO>%PPq@Oen&~vhc zJCSG}d!*7SHz%|3WwgZ+ILOXcODkdt^5H2jXB9;K$ARXYM(^U{z{rUxtV51Fg70r3 zqiLbR>_bK});TjYI#`HKLINXONeR$yfr<%}MY7H+1|@$K)nCHeVO&JYdQo*0$2x}@ zP)nq|TYM%SOXz@uAj`BF&F<3tW4oc6x0V*CjnaCJ>ct@w-Rijj9yzrn77k+nTRN2C znALhxeEEkos6zG&P{Ae*R%l$i5Yye6=sUz+C8a39-nKPyAB;{uuZqX!d z&Oy>(oqFLVJYR5ggO^l03)(cVmO+2XPq07A;N|aMx>bh(-YZ?jP zy7szNE;GR(VsJ;ZyR8{yX51@cvlEgMY%4O0H7V|{}#~A8bJC~E6Ba!T(=zt6MjDV%o1mI zsw=Nyp$1-e3b@0^F`#~I=18p9JALXJybrB=4s~yeI?lQliGaMCDM)=*uX!5j-_&<; z0SDuyG1g1a>F3TWOo~z(K*i$bg1>Kw9b5zmKPQg(5Mol*ElG8X_1w80A_TF(QWVly zOigspFvW_A7H{_W_b5*Dik0wP+823~$|YpSMQ5!*SYdV93(etHWq!zM9;FjCEVTb) z`8tv^KbY!EwHe?W8fE$QPFq!oWfI0+L}3LJ6W9W*moMU0uaV~x(kd;jnkHKUi0+yydtt>UPcyt^$8puH0~3T zR1-_v@wtsgDCE6qzL}uUX5MuUkuWRJ@gF@8P{nb}L<-unU}FqBL|93bSjU(&^6)92 z3I*`JBxS#?t6dQ9Z}j^Qnwij&_nUQrML2-QZjU)QD}BZ29Hgk8vDmS>!3mjj2`RSK zMa1fk9}jSfidGx$lS^TP!|l9Vkl^GeOVzo2V{pFi0QtAV<tsJ`{Gy`(Nn|N25bA;MSBgnMg>AX}_%(iC? z_sJJ`IqcOXIM1iFc2ShbMncfC83GOvNo1j=_KtE&5T%>9`_?P;2@lG!3? z4%0Ws((D;^pqX}i^NgtE056>RrVg8ctULx)fYkh~Bb+f#UL)TUEn8YdzMpFujl}n+ z0yJ^xV~Y!eQN4&obCZf$ZxTqjzA$ehdV55K&JzH5+c=2Ae*N40VP_?8>`i>llFnct z`8nTD9pHlq9fXlRcM4!HEKmeLtQ}Y-NtKddFgws#M6H+qfr7HF`1QD3qK5c3G4N}K zRQSE9$*waF_pv=HMFW%SHqZS?3tqjjAIZeD3T8xD`IgdwFDMi2;{+W_9?VE(J^qW z*e$Md*cZ~UjS5mc?LW?o{#A0+3&Y3)UPT1{@3IMaf|jg3c{9GTG-EQuHPzS!xZG+@ zGe?m7;GZ*Gdg$hIIU^iXdK`c-Xm2L~=hzBl`6aI-#ewGR7g zeshEeX0Xd20`dY?(%ykdj_MABPc*zM5#6q+QkziAo$T@-lA&*}tba6AsKqg*(4&Nw zj4@c*Zc|xc?!gJl{xY-?oU515@DBGWiO2pm?G9k5Y%iCwyUhr~-{4`rs^di|NzBv2 zuSW=^4&8d(n!wMh=WFQ-O=#TALwVLk;(78Os>Z`;X~P{)-6xC|IC%R2dVAzN-+Cov zwF~gZpyIN?H~S{(9NJxAvxTsw_(nnH6YQYg!-ycR!ehukl>=`b3;Z*wYR1sb{jkfb z-s~u7AhtGlpp|CU1Z8@9#=yDoro2HkC6s?Z*@<&^t+3A?>rTbm1 zHfxFRnP&qRqXU$;e64%-m)mM%v&7MVd;to`X@D+YkH564F-sti!VfmSMz#ED!&BD- z%|i}}Z=$3N^@OQ&sm|VlB`L$qSB%O9Ca0zf%ItX@BrXdxn?hAL+VG)Xz0N!TePGjf zt#DJ%m2PwAT9f*3k7##L@7&)Qjsq5ZZ_<52t;j-G9C~s} zau^VK9uA{q{t64hPTnLgu5_9-nIrcCTeS$3qo>-H9jsQjK;Gp89kG#}83*y1!s%^Q z&3M+G@FimH4NwFrG%!Q_tE>X0T%NYL#A7*LRC!&!z=cE3qq$Y)LATK`5TVLxTwTP8fC_3tU+fFEE> zGw$a-hs3^Hd082RSYs);3whkuk(egoG`EFZIbbnFS7mXc^5!=)K{+)#h3=`BQOVJ% zF_`~>b7FY%w|Xmvmq*_%@eqqYOK(fXS3t8|lRqMz@lLx>oY^gqm03JAQF{21Bd;Z< z{};>E^+HByRzcZ2<65g~5dCMfLD}oqsji+S2ms*iJ=utl!6pRzI=8q;;#CSNLxo}jC@KVdgrXlb@Gn~~uayNxg@w z!kglc7M@q(SIS~bYMIRewup=>XFq}MNUla{{fG< z!R!mXc~y5ay(8!;v^17tJNIg=xrbp=I@e=JpH4HB#Ai|x27p|iPxczNfJ7~O=8%nY zIimi9ZE-W*5RPdSUDTjEl2?9pzlg5tEJgx=nN0040W;-Okqm7)TH+(p<*R3q02#-c zVJ`jjneSO@0S}jO2RuE@)yGe+(Qc|(NqEyTf2$J!_=sep8qhHVI?||L=&=fu;RPx| zF=d0o6>>MlDeB^^^^R%u@i-%jk{c3k7~3V@P@vMDG=%R+H>(ThP)(dSsK5$c*4XB8 zrcP(sWZGFZ2ml+OD1fmZ)cv${24-}EoXD^{0=FTj>n)6~`%E~^6_ftLT-U}kZ3V!c zy}6g~>1%$VDrTu0Qr`a%^N_Ch^yDPEDZDA-BT8qu6`bkyrG$w^hMBYqZ25+}I-&wP z--QGYA4aAgKkeb6ZMw^2VZxAvVOjX;$j7(H?{xX&L*yhFSyiISMQ# zpUkqqLA!1@)@tC)$vUNo+Z@NM{<|p|3vBPKc{ZYY;W0HaT5g+0cl4^-ItYs3Q1kqMD%+)f`4VXk2wI#7UN)@4EHsc?QNZPJGWvGqJ1Kmpw)tKqPiQYrb zJI%)tgPyoA(h>!=G?sMAyiB{f6{#NmmbXshcpA`j%Z?tKj7B-`E^=rjKk7p}puR}{ zWN4x#@UYloY-VBTMRZ>T7y=!&NW;Xn+zq*neij7K(P+YPPS~D9$hm>l3)v(4S6cd9 zz#(9Fbi^BwrzGp08NbEV)-ngfbyU_OrTa{bx z(BG(j7cc8;)LqY(i-m6YQtak=1?5OczAm06buc1jDGTt3ALD=AF?=;jyr4S*I#(wt zg2@ky)H6t~-k#cBf(12ZiHs_~4EB?K1~qFxx^h8ukHhu_Io?k9%)c}5w_WtbN5|8c zkPx1Z@58$6St@wTgz;_@vxgI{zgnw=FFf&IUB~*n*%1^Rp#+MNRAwrzI)j}sTw?ZQ ztD-UoDqN%I6oT&1`1IO+kL@jb9!$8q=W2pW7z@uhR}{6qeiEP;_$ZTF%N@5_@lB59 z44FU2lcH6KFL6qLp9YfXy7y6wTd7AaqqK$HMo;9cRhr1MHng|I2=1#y2XH(|H64N) zzX(rlS&{)_(D@@v^ZrmQ?oX*45yn_d_yqn+QyVEd;7zB(pm>(;vofkiOSB3W$AG8 zx-qKoeuev5k}X_UcTvC3qKesV$daiVsAh@2Yvw67#(ZUL*!iK#@H!}RKNKSj}r$Y>0MvfK!_9ITQKRC-2uIK>{^-Y4jmNnF&1Q zdMUc^pvQ7^Dk8AHGu(n*f>B;R+nJphN%{u5>;}#f|53;0JDs$?(>y_pHOiQ0R<(|O zB^ZbQ4B(Nz(Jc_`m837{ybeXpHF zDXK;?26;W&wWgnHkL!9#24tKkRl{gqpOQ|0LAVHkP9m@h8|sW!4x$`a$B*X;!+LLn zu`yco0Zi*Ud1;8WJJ-IhR2k2&ox=JeUmXc$l*zpn;ZyPOyj@F;uze=OD3=bP5JW^% zdPlhRdGTv3Kk6NZ>OAkkvx<>eq0j}kRy#G7t{w@&i?nv-OzEX$?H6*R@Jf)+{%KZ_ zffJ$eER+6;%3%)tgh~1==vEKRY%Tn}Y?~U7*F}y#bjD5j0R0-F+g;A%eO>k;^%2Ay5mP`JO$4qV#&5{NrdHtFIaQpNbIu$T0uWa?Fl>hU8ncZ#O!;83w)Bp3~y#~%y|i7 zCa}-TgNK?S8FvpbAjPyXmo2(X{i5?hOvmhF+{W_Q#79#LtH2%JcE9=G*F*cl+||`( zsQ?P>d=6ulI?J-E3vw+O9^nR#0_yBx+rij$;j*xg7bzp~E6&qcjgb)WIN$7A6CbkN zE~Vun_zcgTVJ1ucdWA-qkHJ@03R|QPKA)$_>FvvY!{D>8Gq!E?)Lx<(AahS^*dA9> z;QFXDQV7+j+0TCVPck8+&kdpVfq*si&^nKqAN|?iZ zs`uAu5ODcJb#oitB$s9Y`-Gqov4n`ALJQe|*n}IXfrL-ox%-(GI=2M3T>?Q@n%q4S z>I^vKT63`eYy_^mFUCC;>AUU-ZQAVP933S1SemhNI9MEFiFPdF`GZDT#kV2q-{o%V zo=5+2bwC?lLDq^}`ABt1*WT4iaD`|S8G2Q09jSZ^5>FqK>TCB#;9HZvWJhCfea@_S~)pER!R8eBb=s zEifBP0XeP_9n!&3T`DG6vsDJ_)(Z2N60Wb4d=RtQJ%}&>N2DE*{;Sp99GkzM^)&Zx zlba<26(vH{sDevzwF8|I6$B8?5_f)+wTpaBhA6T7HG)fSh<{eK&b#_3$Aw*#`POGI zvp6-~m=sE(|9d&0RqLtPRK!89&D(>(FhCO-vP0}jR()!3ki@AaU>v^~D^5vRuZ3id zR1jeUq;L6_Y^(!R5wLl3A|u6wxImO#ZAlm0d+4dM&sO-B*14%*Vz|$&vW&|T#7L9w z!X)%~bf=jOP|L=t0R2V^z)HG^k<3nKM8M7tDb0~aj&|M3ZC~e&kNYr#j@@_h$T)qK z#esBArUVtAr^}VuVlvwZQ?j8JZ$DlR+4Y#=IGG1$2v0SrEd-R{*$S^=H1;aSXUq(ElG6S*$e}DGRo^< z*wGa?k4ku4LvQF^NCc03o2unuWBMpXVpz-H#4Pq1Cs1YwB$!V~;nppkp`)gy2RXzp z!e!fZn9N|#PG0(8a~u{m{)w(~H~LIw%z&ZkS6K#1Cf)TFjxk0x$hz8ZK^h~Gec-bU zkF`@ZVpE;Zbt#01BPRAXjoBcE+zW?0&L#)vN#q_W2l)TEW zO?X|17TgmYyC=8g~op1%D85$7x`1I0}v>gY}NVtCbJLI(RZt9tsbV!%2E z(ytmo5__`pskdqGCZBWItx5|4detDSO}!a1@dO{QYvn@|vc-0&)hPC_bie{Kg^ANw zVNe@#OO4Y%EkIffzWNj(fHllfa)&4NAcs{I5&{dEH|cdI>epD5$Zb^8+ME*=x%d_D zD049|UT2}T9Yg^PSq4aI3s-^l;Vu;BW}FDrUz8|%)dx$bS$H?{vRCBYZ_z+ zo^<4-0grLA570~Y&etvX-T;st)Nvq|%ICE%;DSe=_fZvQB76j2jpN*`qJCV+0kqh` z(uzTHHn>-xnD+5#t{4)tO|C(sQl9-Iou#KLl>@z99l_(?-Aa+<(03!oPVoCTC$P-! z5aS)9b(`2CHB=ECJ#B7pEc!7`E5T;F)z0>7DRfVIQA@AF1o;e@eSNv!Nu(^_R*-Qc z5me3N!}~DshE7oyudKaLA~r>pVtA@9^2l-YCyv8^kCBk3XW3O3P_SUK?Ts%_G^lXKGt&1 zyn?yg%eA*g6I+@>5`9QKK4ZD^ou2W)cf=KfvoGiD<3DK8-=VSsw;G!R_Ot1nEk^P& zAnp1fiCza`k?*Milz3!u-*9#e3ppL7j-g`vvhrANiq~0EvQ#|3qah0lk3Or{LeCTi*YG2|MlNHT-I6)Z{LPWr3c0~W@pcKAII zL}ggZ&!g=?*qnzT6MH$8e6$^A@Hn6WT|Jg5VmIpqv(-Cly5Ev>-Up-Y4Gw(t?)M{3 z3mSpBZYXHdiZal^o_9M&>(DCJcNZpdgRiLmjjA3MTQ`&6K;1&Br!we^B3 zT+<(i=4!?NW-IrwYM!IMA^JenZkvFKq*Ow&BVqoW+T1c$#nXF@g4@s@=nRWBD6A^m%duujYZ-d?33(Sp0ebApDgZXW3iNPjqC;S2x(a`9=ib zJ3{w&+!P6=t%QlnY%|RNbjtR*LXquX?uoGinMk3jqkXUBndE-oB5k&?6-* zA~b^>>SGcOAzap3&` zbL3+~8q|f_pwl|!y)arCy80!PvA=&RMCLa>!t5sEJ5*5MkX$&SOF2@V6FDGfBibfy zj(MNTk!YReP!=kexzFDVX4a}ioR~qm3m{tNA`X=mr^4G^rebC#| zvrVefZHS0S>B@DHOBgKa%jkDwhUfx!6;jP}hz*z)4On-HkDW z9B>T@qbv-X)Ub`6BR_ZGZHiI?h9R}^+JsfSkqxuYJHinR;eb^xZ;bIt_`_?kR))CK zrG4nteXS~8nfpe3Zs#-P(8_{GAhyk&C<;S|{p~BpStM@76tHC>kvTEdA zFzHH1Uxtn)uLzSlhs9;U;pN)B^zy6FX&(~8O=-Q)0dyuX-2R>Q+h+5~_kR&vq=|TR zT;;;Z>PB6Ay%5`HQA7nBjx zsM@nE3wj8U7p{ZAsa}MFvQs|L$uftc)m($m^guR%!jXgA9Y(aHRFm{fuBI2nrkEV4Q``A>y+VYNC)RD^k|1_>%gK;}1})ufzc8 ze%Cj#rf(O`myiQ*h%Tm~Fi0YW0qIlH?a{}C3u&`;oozpHY=7}-_pA3hiXW?-64rS? zd%mz}8~!a{84Tb!gg#*QHx=$_3d)6$nVa$Lgh9Kgc5SgU$VPp3B!}!?FE9OOmkZxO ztd%qjga3CDG*qy)xZXy^RW~kUnt=B`pnrROsMbxs{T0&nOUK%=%)k-Sw^>YAB^t6S zWeBy8oudW5H>T91A6jHx{%6(>Dyk|Wm1L5cxZqLn>=t3xC2%Mew&!G|#%qojCMnqq zs&b^?Ya@=0)6sqqg8lPD|7weJk_Xa3DM|iZ8CM8Zf>@zNPMYd9)cCbKd@YQ`F}t`@&tXl)gz=);2%a2?^A6)slb?o)Ptp!6+2HC$B|}TX`YEBv;6RrMl|( zi244I)GG zPXV!92p8;8JIS`@=r>&A3~{N0Q8uYyW123YNBGQ_#Y;M~^zuH?w zYy^)B;kRZd_8HlP&;nli|8KaVbP10L(qcHY&+L^aW)2wyMm*c;0DPQ^p&z#3uzCwB zLtvI`f>YCR=p4-_DPcLUCq^Q(ZmqF6uf zc~awJu2N9<(;q_UyURo9G5vGROIJ;mmZ^If4 zvaEsl{(a6FmlWOaKI8Fu-#`A16i<}64~$D#=ZDr_V4R`7;(<3Kqr^8@yBiz$vE#To z0=ZxvGsuvu5(CS36T{%=<@TqsboFdWZyj&T=tVso?F_ueS{AE(ug*#@FD5$c;)YG* zfN7qCOs_B}19D2Iujv>^hHk&pW>|X2G2yfDhbcmHIE8m7vr=NPW`H)fia3 zqAiPtNFXF2J2jpEcZ>^fJhokK!xS>+zNJq-QCeM?uf(K1HlKd#c=S5Ez?)+*p-%CKlGxC2jE?tRtH*JK6W;b6< z^kDh^crq>yx)|g%@tmxaHXv0sH7Ce8cYA%p>G7H?g%XaioY=5%(g<(nY8Mi`G(@0V zWvU}1|x)OW{Ov#I4yFV84%R~QPd^~n~x&DV}n#A+_ zW;Eu`a4Ch^_Bt*e`@=An6)DYh>ncowd$Zin(CEaojK??-j=0=n<@W;j^fG9Nc_G9dARbkGIB}dp;!ll_Ao^zxWeJZ zUO)ZKO4o4a)q^&Y;YJ-4y_l+*xgkC#)1$sB4bXg)F*nrLjF*BtWDX6TeE`VhWCezA z|6LX$vsZK~PyY;hu7ILC7o=G9W@nWNQfY=F(AQi!b|$=c!p8e~nZLq3 zs>ZKY1s*RZUOY#s%TjIkMlPd~$)Ql4+<-J@Yn4d!CinfY3Q@EUCYxwJBX#`V(veP! z(bXKqtq*1XO7~cH0$L1K&sV5cc(7bGYgS8bg79K8cL*&xK~3&0$+S|b?|xHt!xT*y zsw?Q-d#O|hf_mSB}h1iy7OvW25u+LQ*+4pKDoPb%jB$)@Utsnq*~cJc4|=^`F&aNK*2@QBP(k|U4v0M) zwmO93`TChzR?7F28pm~Zq!_P2Sq`eLtujIGax20lIZ2J$QgCo5Bp-z9Y>L$;NJa`^cA?&wWF2JIvk$aRV%5LsUu=8N^o3(AgXC-rz*po3M_7NmUL7fZ%>G}f)}!t3%y5E z2OxtmO@5{6nKV%6sN=tvBsjiCCB7C0D6X=G9978|5%W$eZ)2YwTP|{bP77n|8^PC^ zdRF?DT^B`z;)3N`oCLT#D>+)4qvRBP0IWf@&2g2*e%MjDS$KTz{dl<$-vJ9pQuP#_ z-i27km%1PJ)2^{VZAebc(;n-q@=SlXe@ z_AfOPtQ@n9z>c-xbj*-;s4x5^NGpskLgfdb&-l*$=)f-ib^Ti-t}RR=r&MLM)rqW6 zK1MEmD2DE}uEBA)+>PodMI*>0TQ*GpQFHpY9Gx(i!a;Ciry#uiOy`Y+C}cB(F6-6g zC~+FOJX(Qa_p4;2hiHvNmV6lnDRQL68^sB_<9r33bnUZ2{SJUx`&xbO#N6&7`FVv0 zht{^ChCD;~jqi9%$c(49W4+8~?+>~PhRcWMI=hs2NL%3>*a%_Zse)9P7-aF_F$Wys zv5q>?^n-QX4CD{SqrKq=uU^Ydw=$M%hXO;_ti6Po%$wOa{r&?hr*sX52sabR5q48)W<_b11jT<|RP z=~&+WXl2{f5R)B6)(ARrL`g{}2|%4Ed*wrSJ2XMD`l zhaqp_!3*}B5M23(9)ePZ-qCVcpPbs_08=`FCA^681h%JSB7pp`%uU_n^Ji-OY8cqbF5o_nEFJBN+C=~H0M{I-C&h(V+H?DS-G|K*3D1Z6og%HwMn*$*= zcBYbJ!~s(|t?amij_>pXdlxWWb4o9#~~DqxHz_?Bdj9&$4Q!ng(mD$@jT_kvk+T+;5i=dbAwwg6AyDrcpf0xMy zzh_s308AB?_As6tO+F)TEi_jGQ4RfN!Ovd*FN@C#Dvy*O75DoZSZtPQn`igs z>n?+8?K@c&456RLhdIwhEnMI+t}G5t?{vrKy7-^~v?&0=sIePhELYv@95b9%A2WMa;oq^oYR~3kvWLE#NC?Fpd-KVys5n-Ft_8)Wv3GCu~67x|fI( z*{rV?QC}@Clj&`d)bS~0?zcnxcT7xi2swJ-pl_S?nY~eeW7dAOM&)Cd7=jCOtObUu zgKg%_6k@UbA#lS@rVfjteIl2M3O1Vug+z`p1EKTuq&v~$LlKQL zc`dLEEAs~WBLz;dh!#)hGtX`xCiXW46)Gt6S%_5|{tnMA@u5gpeU`8J>$C#VY6sGt zb;%M1BzA6aC}ZHae{xFA2EOen2A;L=$}c&$yu;p7QEu~$wIzOQgJUowuiZ;Zv}^HJ z8#Q21TPYo4n;T<7P*fMP*PbPx$a3BfT*PXI8A_9?26Q@p*SGx;cq}Xtl^UQ7HF}cA zwF*!qF~^pHS@{$GKjlLIRW_3w-Xse?I%7pRD6F`~K>up_f2yoXv4f)h1vE=16JCR1 z#$ePU70OP{%t87^ElcPCLJ%Q5E?{uplqiCzB}<3-vas+)m&76j0n>_PnqwHXKHPei zF3m7B=(~XKsN+ItIt26Ks{QpB2!EaYLM%X-Qw7Xne}-kR%PtTw7u|5v(AY@K{(Qt@ zj7r1PiG0Mcr_1-sG!7%%xf;i8{%`IlenkerqkMC~vhc*8Ti#}YCib|_N;4->M^ycv z<)@1GciB>b9wq`nKsq>TN8sfJ{Fha2o1ooCQmpD4%yk6cz6%Rz-6A{XmXF)6bytFE zYF*6SriFLE$#)NO_zC;+$tnn17<@sHd@p(0N%S}eOx>#DtA7$G7MzF&x_Fw)XZr16 z4`3RLC)e)aYnzegtx0OQ>sF|+MO@vQ^=f$fp6~F|Rmy;WEZ&7h|HJ4jD2{GHNxPX;1yF0F3S~d3=~?P!4iP3;N5M%{f^l>apN9 z*7s&tleEFrDhoJS|6ST{p*t}q5ZRE({Gxix0}OJ1JuW{XRXr9gbe#y5Fe4;u z%ciTQFo_5N?SEpj=FQ@R-TF~BNZLHV-fd(=*2tp!jLxF^|1LFqX%k9$Z$)3PR^haQ zB!0#$$Or>XenQ|LTDkFH35)HYp3yDD$R?GuMUKBHT=POUl;&DLDAZIlmJhNHdLRH> zQ+GQv^Wq*gh&<*GTF2Ernhd4M;ry~3(yA9sF?z!)uL99ZM?CE@F`%kCw9$#0@0}|p ztK&~BxVpCU&6mY6iM+X&Za?ycm9_IWxkjq<2bc7Pe0cu=AbN4mmO2@xu|hDx(96eI z>LTx8$Z8IoFuRheD`Y_N#`6wq^|e8TNo*Vk(YFk-X(Uz;yn*OEGnV?%O{6T*X628Cj_O7ICdoso<==^s?hcQcb+wLsywlzG|{8lRXi+i||6l za)FEwKQgzhG!LYtrf^|sto2Hlr~FJo7F>9>HDK*r%Q^|u{JxZobpX@lUi!x z;3E3jYJ-zjpm?*)9ssXss25(v9jfo<=ZByaKk(H6K7yd@?d~SqKJdADDPh{u(7N~-{foc4Tc6<7X)AUuEBi~gZ zX@e|-CcB~O-%rPwhTh7dDhcH5l=5S=uvkJK1pzb{Dt=PQVNQ_qNOTV;FLsdNAxAt&A zVxxlze^)jcZiKX+aFQDlMRq^&44uj5Nwd{5r-d6I$oO{t{jF5o45ma8K+87V5i40$ zu1TzLO}7Cz=>TDhBy{b&Z5%ZhMG>4g2aH#{wT6<$kL(Dzvgs}p(>#cDgwG5nSPRIb z4yY4(wA>{Oo4`O%Dk)f8J8KKa#DP@PVnavLyP>`3e*@0%wfu2d75qdt1(glg$1XcM z(T7OO@YxS=LZ2q%59nedR(YkG(2@8oADR({amf$UoBZP#&qsZo?`4N0`wPEXKQiFp zhGy{Th4__~`{9=lPCNHbLZs5WqSNpA_Nx&-3~kpU)h8YP>PA7k%eVfenWfUM5bUgV zRS6Yiaxvksxt4NoKw#cUpsGltM7>le^)^i8jUuxojvJ3==y204q5In;C5y-kV)$)8 zUWy%gWcF;_D>b4UNZx=%HrPBd4QB?b2uVJ>q32AQHk5$ke{!;JnkOCDH2W; z&rRFPU$`{tOY$_Sup~kbA@TODK!m^V9lfU@nD`r#qxy3<>bdhbL z{a%C381;Nk+nIZ;ah7G38-pNLJ4#Fyqo}J>HD-}>@fY#@ayaUQPzhsQ4h10gQqWRw z8jS=_YnVWJ!rues}Tn_?pDU-;i$3IOa{BBG@`ioB)%g_y5?fIu?t+S z5J-M&DRy9sgk?zGoOw zur~gU1&)X1%}|>X4;95m=Gy=E;@jeFR=o-A)6J_VC;D)0f z@_ws4h8DgIp!XjGze5SJyW8|My_*KhhLY?(qsM?OO27Md5nr&d%{Sd+)WS)5)VFP? zz@mjM0_R9r+oxb|$2I>@nc4tcqMe4s;wN!+{}xBR&DRiHzF~k4TY_w9TuM{-gGu0J z8omE2?-wrEFF%Dt%Npxl^Nnzf{8xK8zpAR+e?j5TZUM)#*F`$0Wg!cK*fe3(>N7;! zDsVDC!1cbJtk>762Iv<72lJ?OCxQwb!%)c0wpetB(n)iNGc`42Hx>sYT02kh3|SAI z{E$q(DtwIgxm?5uf3d}1ggy#%5|q>7JO>ik{-$rMdQXV)K2qyT`J7!CG4zI zs5fesVRG-ER|CR|IB3*E@aypGn6V5^I`@CeOsNuS+O_EXNV-O$LG`Qn?X7!{Rw2%% z_j)0(0Wvm?F7*anSaQ~R1T>DGFa;iY2GnG{PC8ifM&j87=L5+rSJ_=D*}7m*?OL$= zZ2WSaC7=IZI|q37WYDGdCs1)2f0Od6VL`Oe2i>)TYi6v@Iz+Cw%C{;9&!V0X9Prp6 zoN>7^L;gJ=LL~3v#kJ7SM4hFDdD%L(P!6~Q@8PS-!Qj%nNw(_T>Zx*i0}UcXl-0+1 zSww3v_BGu+qr!r@4fO~mVEUk-)lWEl=UBvkI^I`Tj0Y!!=nQQA3q(~DosZ-~%cy90 z*Eu~-mLL<+JUoV7Y=?aq*VZ&3w&E}^H7eI|gy8@qNg6X?D<+KxcA98^%bVKW@bbx1 zW&AmR^dsZ>scf!^s>?NCl}EM&u8FP4*<6?*8zcVgu~Tm=jw8QYwMOZ!2ihl$ zIIsnszo~hH!Pok|yrBIF0@1EUCh-3g90j)kGhx==<2}1MfYF4I&kWCC*P>-!jHHP@ zEI{%UVZ32+hy2NPk7YdSxM2ZeUN#xAuR(!?ZuDG);2wUuiUb9<{3m3l1p`@)#2fK zBk4XuSHgvE8$XPB7f!>wdxQA`u~E(v=zlnSLsx@uJi>F5dqNw zJLsT1QUjwqTbvH~DOi}CT$+)l4V*+;4bAJ9;M!X(Z}`Om8RvfkZW3EQEfVzrc5?`c zesB@0>k=4zMfzQJx`&O!)|J2xeqZ+wi5=c^<|CT`?Sc$}VkSAs1!&OGJ@8EjdDND; z%kefsV!yWYVNq&;bBJB!4Ku&7XV{sGIf)Y4BW5w47y$*lTC(&3E|pf(?$e4T;Dcf{ zr6kTERV^U-cXaj$RoAah(i!>7n0SRJXrdUw&`TPahv|(vGH!Y7XGRnN3@Q8h@y25i za^%QIS{&Lwf*cA+TX(yM!=}XqYt`yVADN}t*|bTEKq<$(y`$B2nh?B5 z>I~;SSz_-WI~wL9;Sc8CZ_V|qdf{@2n_CY}xW>`M90T>q7#9+i!K|8o2^Cx#3`24;*C72)97&gya3^SL65v^V;f1`aVTRoS(Kyip8sJ}z@ z*u`dAAFGxVqoPdY`&by^Uoj7 zY?mJjAq0*^DxT+TfHwCEDTzdd5SigYfMAD&0O`XHUHiVvyyoiFq_NP4V^2nsBk>rZ z&!MSayg_wV(6!G)TPs~kyi#i!ZA>VpyIuP>@&9BY&Q=`LCQ#cB1QRJ9IDJSnq3~To z(Q58EH0}ivN&dvm>@glI< zv$a1oxXPu|Q=!_&(%Kdp+qc7RF&qNMbNOzp*|q4m#xJRm|80@0fzszcPsC|6sPg2-+7*&19b$tsc2Y(m9&Ns* z4EEqa5J{uC567c>cS5CmCY{zm&+Nm}@B_S5SFD|J)&rUER9fmr%|O9mkZ?5QDvyCR zK0NlK1rh$6bcC)>0JQd()Lw9zfMukeU;QA-M_*=}kk6xVgmq*?Z*5nEK2I zMuNDp?fqk%|3(s`gQCw2fCx6J6x(td1N#N8pSMDv= z#*B0+RH~zdDPhvbOFRlCNH#J93TZw~M5-V2VU`?#reEQp#j~IeKZmf^V^K}A=2s8r zAf-KrQCC?$4$(qt8f#K=oGnUUCmo|{ibkW@qFk}zdT%rN*J=4WG0qH?Pt8RN#<+U-uXImOl;5gNsEiYtfJMU$zMgc@vVtHFpX)tA_;24&f!i2{o zP@gLtKQ`iG`OtPukcPv8P6;fVoVwirzo{O1LLvZ60Ij~04ovEh^OJmaeHOj-ADAqL zOqZ?_;zDPft~M0a^a&qPKtQxG4vm`x?0Ri+a}r_is)c}Pd9pq?34f?+jKzWay9(1K z<@0HYY{sE+t7qpRK9$=j93 z1g>p@VBSBX)P_cQP>UZ+8b7dGn({51*;VIB&-mWIp*bpA0aNeIo6AM4wdQKgJq}^A z_L2OC<`suA9Fepp5>YchynJ)}0nPV}w>p+60(zgw(-3FDQ>KZ1h^r20e7Sdq+>v|U z)O;zCDn>m(ULRRKG=j- zjPGJSv6-2I3U8G~H;1Xa?w>H%)wChhb1OIsw@PnhZGh%{)X3w1*>aA?o3J8V8SqkP zIygb#OGutN`=wffl)x)`bIF1-XOLrWz}0z758VFrt3>b|=ud?t{z`j^l}(}JL% zTgDC*h*6pm<_lPS2_m*?*k!sdEfZ_+8_kPpP$eFPkQPVWq;(eO)WDx0QHuf@Ofw}BesMwkZ6e&zaqfHAs7(P$`{nm_kAUa82P z=w%aZEkC=V<+*Uo96pUVwCjoyo3Rpx;r)DMU`9;88yA3MVvFsu+cJqi*0O2FxLLO<3$nj@L>_^q}+g`lBZ|x;p-lF##;9GQCM5xQ<8P)H6PikFmD$8a7FyBs^u7{iOA zI3~Q;$qXfQDT)icoqNH(BzS9*o6XOmo&-r zemC5bhGhb%>fi0`Iluok;^YwZ{C)wRE~7F;jCr3r50*X_lXq4x9M_T=QM;Mk=1BW0 zTDmrf|6y)Bq9k60i2OQPtCpaE&>%w&W(3uC_rey-k&V7x{@|vD0bISU`@x4aG|!bs z$kitT*TOz$*Ve?v`QWwTUd&IMP*xQ+1kfJcH$}HyFySCe2y{Bz`o$b!(QD8MYEs*N z`A3Mz-Rnkp8`h2qNTRx`tVMSraT^z6CJwe8v?cudX+|wzpdVswbC;3ZM!lJ zl^IuPO&g03lyYtsw$fTh(ta+&*iDCdR?os5T)>HwYf4eKFlPX-R+B*2- z+qrgUikNJb@dgd_6J2w+YgICK3-g)U5pRxmdL< z7oQln?|r{lyQsQjb5MEU-YR`H>oq2|GuFAcj56;KMkn5^S4NyJX=Z0K2SH(v(Op)3 zR!#q9avrR>b`85C-d3scu~m5jYp?gdp12L^$#RcGZA#QLO=3;z4bX>xU+uTGp&vC@ zvV#5x#ss{6r_8rnhf(KfyUDkM2up;U--#AjEyqIW3k*=%kXoUi0+2i|!|(BnfHW7n z{%Iym8pkvKcJ^8woOa|S=Mq}n-9vtWbgDts2b~MQXT9p07RbR%y zoW}xK^oR{ZMuY==qZUbe71RtvN+U;Pz`s7xuvaH~Pq34GJk#HIy(N!_y2;O&XhMKv zwBP}XUjmLXq*onTP%LigZI&!C$&~OU&64|$4L!wQ4JJi{ka2_1yeNn@)SEHsT$kUa zqOE?mWtwm!+r)cu66zjInd(Qlu7{$NJf^v1r^3KqOKfP7kA~V#u_#sPlbuw%%+RXR z7%84;uVP1s(X$9D>iGeUVH+h#nKp2%xyC&~6|s>+Bc)H-hegzfWtNNrnNQ9T;|)k* zLbHH{%yN}?Ae6ZSSS-#CTPC2C`-4&7P_1x=z%~`eTz9FG3{9mW5T1WG(+^DFlm8{3 z2Z6GSPW{Pawwz;KiQrK12ZjfS>CfKU9G0~ZI0H4TY?7-Y=hZQH{=!3iz3A$2@gThd z0|ZTa9~q@I?)<`*zE`u^=9_OH&66#^?|`}Yz8@CQun z5>DXvro2DB1@7yE$2>S*e!_n4&l4nx+KhJ(CMx;@=?TXG1o;7}fcK6{U`c^|6}QI@ zOBF#xU7MZ6L!!5uaY=G3eLXw2LmI}?>V8Dbv_b(ur2{{g1qqz4%}-7gA|EnyU;h_S z!Fj~)B=vVGTHK1neR!K4g2Qo)P523=^1r4+=e(qNb&tj5i<7+U>URtpZN_>ATLH?4yKxLEjp>xY ztywRu7uQyA7%En>0{P0STA~gxkU+4Xlu}J51oC(K{ndtN*hU%w1+afwlv`d^p}rr^ zw%pVqG2*Z%305hYE=0n9a-afVOl9ki>K9ffi(k4#XOXyh)Ul)m=l2l)2c7SSXX^7z z21!EvWiPz-%x$SBpKcU0NW!wEcI=oAmMjyWlGEn~dtn2yZ-u+KSHiG_*D?Hzj~NAdjj@K zJozr(nle?#YE&0f>MZ>9*4%uNd!dDOT{Jg0&5>UazKEm955!IRjL7LXr_%3R&E)xK zRf$k76rV1qI+zk)8O6KnSyofVyYyc(yxZbpoG`7#$1^-FV#5B%Wk~^W%axRilx%2i*i` zE#0&&EzZ06&I^$ZKZtMo_J{Zm#xnvW2+Io0-?DX2Hqi|}ITGId)J#iAySnh;f{!KV zI?5a;qGS3|v|mVR>ztW|r>D#Lm%MAkPT@7xSJOY#3sY4IOr<_c;A8Ze{!{ud9e!X! zV@_JCZHwL=bI&F!p|p%@sxA`l1AO7ayEz`X{ap0!^&taMj`|~~*@#}YW+%F8=}-cB z?IBH;Koo5LS`LrE%lhVG&x}VBtzUfGuR$&V+YHC(EnzUt)VwGauvEm#HKpHiFLioo zmyRXMdSZuBq%?V!sdn8H|4g)d)o`-YL2E3;Y@3==Z1g{Q7fhs^I{uZ)#yGUffffY_ z498a<5D;Kl;R%mPNnXAl`a58d_lI9!E|1SX(4sT*=z%?mf$9cCz|6|?lLa?2s|TaD zEBkU*PQ>B>z>wp}sDlR95hbD)4QU8fJt}~E6T|%c98T)S8sifpD$Ci<{XSSw!BI*+ z{edhX0vT$s@ov_m^U|k;t&NfD>8rMP)hmAx*)+HpR|TNI6lAQEl1*Gx(Dfs?vJ3Gl z5(=@WIdRKLilwe$c5m@XdI-wMEe-!(Y>4J^3tyqu$8i&{$KJhR>tK)F10u_On1gX> zc!1!4ick=0_^CxTvoYoQ^G^B(;gu;?e9NTOr8uU9_P0&!IVIs-ie7s9%W@^*uc&e< z_ds#sU1Yy8(Bc(H$lJ@XWBfWQO1f=&P0+uH!$V7}62#x--G4#|O3UvP5%lUh??db9 zT^64NE1x~xIA`8U_~6=fRxBH$c<4$#&qzI1EScfBs$Hxc?xy0iUb9ay-kuh2&%U zf0hk2B*tn_)(B=&t?Or`s;H04;5tloA4|neDD#T>9?HZXzS%0MpY=yDc+Z=0J0_5b zy3sU5Ix83AOHhzOXSpR07VX~4MM*ah(9qXx%|!H9gV7vjW$1K?J&k}bVT3^2`shfAQbL+Sz#gsi@swF}G zj|rnn!#R58nsu9UbBci_K*PPFNdIvn-7IEyWzsTc886n9>>k%FZ+*NT>WO#p!wb|P zpD9&>d_uiFKCCyP^bmG&r}F8zdt9mr-4xzi*dQd7=Rg`#KK~Nn*0n)KSz=C`{fX%R zGN(>NM|xZ;Zf)enw%o1p{J&bu;`J%tA5ia$ub0L2?!GU3x5eyl^7~)ki|Q}<=@p@$9?Zsri1Sx5ex$@%kYAew%;G^@qMM zqPKir-tUXp9r1kte=pF^`2LE2m*~~Q`8^g+_7=F?jGgvgce`%%N8qmChuh1(k!!w- zUG8tg>Nnx^!tbLWht$B*9|HA9sPT46vX}Q_>9fBIutQPgk?`4g`g|${>|AdmmQ3p_ zl2sC#_T-Z!-;^=}(F|LmR?ajlh3pzxPOwK=taN)BAPnJk!|XYsXWHCY8xNkEh9ZzT{`H?^c6_{$PmQDcVhFTH{aH7y3?A zu7~XgRg}+K7Sg?EsJHAFeX?WDHsKxb?8&z=b)QJUOD$H&%C~)S#ZlrsiSMhyk#Wp9 zCei5+Ct6EaKC~@xqXHU|p0BIYwN@a&WPNY0F?93IWc3MhX>eAykMEdqIwXANcJ9+T z1rhJoatjoexJzL8R|}|~mW{H0h<=FK4}H;3>-ffgnSJa=(0z$Ey3#d~5%f7d6NI*` z%Sx=4Sg*q3^#NAYZ>l)`7zI|BYZJU$>xVZm%XIr63 z;DVEaStvO)%S;b0XzDtVr!@T6axg@jZRs`B#Tf+q;79k8T15<8tn=65HF8&qV*!Cym{75zFd@OS8*q+^qI{IRxq4G)@%CS z8*TErKqgv1!A5F9>Fq72l9hg1JVB?RlAvIGNEO>SI!XZh2?&Mr@hn+dOV^m0|3z3m zlpdpRKp0D(Yr2`pLDg_bu&sXuD(BsGUrrN-B?q9R$9-g1C!vf>LpD{wFibx`EHDzO z8VwO(C-Z+UA^3Az5N}*{V96o7nUU%Ld;;Qc7iny57lTU)zGW>_99L zC!A#^hfKPKF{zZvY}M?OL5eJ3X{o*z$5kAzF%y{pfrAV!859Px9(;1Yxefre&V~;^ zrBrspKY$4AxKqK1?p~x!J4b^vkO|y>2d~-M4hh*kt`*`rw1&RTaR+-a1`b+=ZgHvBkO38!OT~7 z?)`x7m!R*?uxQ|D= zC+R^9!CO7id>I;cJ{7gJREDE>*CH&UVu4_|yh!E7trJo9!ub~$@AQrCaT30qLuJ3# zRE{;zcMM%l7hr9Dsj)ccW&XxU%tNc{s$$vYyEi>tkkvI+H<9}{~@kMUq3|5&z);1EuG zi8?+A6MR=3{-k3-G@`QvbVcDo{5r>SWTVy9`$1;d5pgj$Ig%zh(nxq5-t`L>Su%S- zh#vh-g$MM7&o9zc85yXbPtuQ(J;#TFd4R8x(=o_4_S0HBqV7Qef7)R)dY%Z^ZazM5 z8AtM>q;6la8|8!R$)=t-r_T~ugmbdb83xrnaC(Jv(3(Z^Oq;cAUdrGOoCS+6CE^dD zGZQ=Cdxr~lfAx#sFkwBD?T8)vgNx_Fc5{Rzlo6cryEd3og8=RLB7{gU?+AP6&ahYc z^DfeWr}xz`$|9ik2$wU@`^m3JVs}Fr1xDW`lS!<{lZ0xJ1=!;OP;j*)Dwl=}X=55Q z>b>|iq-#Vse$*K)q{+;;#oE{~(P_%%#|4hFZ=U#|eqkG@4jCxD>rvaAcSI#MFwSIL zYEmHbUfC{+_%Et4SvC2sPwL@E*n68Pu`<2k&)b%xT#;~n)rz-WNbrVAQ~u`vK#-jB zooAt3fmzCX#5DNqs=;A8e~AMcq9$srEEo7&Vwxx3X=)`C+q(<1QZ(VdGH!@BVXq0=U9)g*idUcws9}n* zvl{Q0(f~I=$iJP{DNd{SQh7~n6T)LkGnj0l$iS{9s&=z4k}*bn3)k9U;hH5Z3z0QY zrD5E_m5E!Qe-g4B;sZ-(_3>d5oDI+&VsM(H)yW1>;0))O{t9FHN`z~Lzi$+a33JB! z0PaS?d$2(%NOz}75xnuCp$rk!E4bPuBUHB7mh)C0F)aw|zkFA-?rBYNBQMqdemI;^ z<-g^p(;j-*{O3|^0>)0Ur=7{IbFI1Vw5dSH7EW^Mg>jQtP#_DKm+0iDb!3?z$X}kj zaK||j@@C#j=^k+uLZc8}#M6RQ7C}6joI7p?auSOwLmKinyzT#i$cV_!bv}c>@b1`y zgVMNB9nws}_9}eH7T3`La}=m!1r&A%5SaqSN4&nh^HOmbHki+C%eRPAR2%9z@{gNF z2GG$n4F!Y-+Kk3a<6I+(=)Bo}tQw>+2L*|z0u3?QTyJ=|eWyemm?=}Jqa$C)QGvaR z4wF5N?x|73m?s={l}lbVqELB5SCd>P{^v081)h1qBVP(h*lu0^-MQdExnEarzUI%Q z2rIKbb*q?D>3p+%dGW!ESQw`d%C`xRDe!PO|AQ_prX{&=n(VB_?`_0SL#Wo;YjgCW z*M#Piw#c^0`&?6q7o-uw09&)N&cJ&Q4wbz5;60v>$3pCTXbm^y9o8tZxsUxjnK&v} zdLI!vn1$Jx&#F%&8P28&JVs*gi*Rc$vWpThVPtcD{>lR7LzKnuHzi4rd}MzjWC98Dcy#$C+~cZwF5@vwF_ma=`v zdG}ZL$}MTY1CX?lN#PrI^kYN^&~(fY7w6eUQM8A~^r#>)u?nrg4?_p4FXT&Uu~*V* zVfx-Zy`CINfsfFcO}ero-uACOWd6sTqL&M^Hdua0?{fY%l%E)Z`)XZ-htQHlq#LX^ zLW$3Y+0nIbfNr`$QhPEWs|Ms~%;dC9%*p&C0#KPdo2x%5h{R!DjE_hl4OH?sZs*f! zn?5LToX5}@Mc~43G=;m0j`O|PishHjIva9C3fwtzny3My99N81Z2gpPEtg=#awIx; z_Ccx6r4eqI{!|D817mEJ*rnhwk=@JvXbo^ASZ>|j@duqoK!#GU$+ihl%fl-6kBl}` z#9&I~NEN%Z)|b<&KQND7ljM;dKWh#%j) zFOkVvZg*TN9FzV;QX&&w<3B4q4NAYVF{nJX7aV)}5l1;}APL|fkVUdzgx$5Kak&K%{_HwgVs#<^KUj&!qf&xg-h4Yy&) zJp6OPJQnu-py;@(DAx`1g`l;#mr-o5fNn$ZBz80t`;&VW9y_hhgr#mM*ZPAFZv?J$ zP)$&8oBq1PiAF@~$>HuVU#CI>xXV;>`5{6|)8TzX!#eztpBb`|M=DAou>h8Y_US!; zIKUzJ6-XaCdC~kfS{}Ak$0I&!pih8P+^24B;$7xG%=;o;W{RFG4-}=xeMum^+-x5> z(t{#3j|gh9Afj{#nk{y}HICMM6f*jc5dR$50Ga#!md6O}qGCj3WCVnBUMOY52R$zTr#*0=vpd??o#sRcOb zp1M4*6}bJ!nh7I8aMv?qxhj`tWy6N^*_Zeb0xKi7Pzi{<23mLZ7MDv=;6lit*`5z< zydldyr$tT0@x|h%-X*8BJ(mXr}uf@xVjc;&O+#>SAS|M8Z zu0~}Uyun~0aZpmPsJF@6L5P@bfh*iYVl|EaX)rN2b9RYoKvN9?wjwU)1Yt$KbZff5 z%cWvL9AcoI$G8o$_-OTftNYIhGcH=pzEmy;dp8IwFaRT{kJGr5N&q!`uI)S<(@8OMjKJ#?dDNvLZU8n$SwfS#A_v|Oy7 z_E&8#CS`Li(t}W7@##AZY@pxL0?UW&4rcOZ=^1{RIbk@St@*p~g}Vosw48yHKU6I( ztP+^vmh@_5?f)y(UDRPjB4e1eMwT6A`>Gy-wvc90hM(FmK#U;lTEBuZTJw1h6TjrZUj^(x^Y2ZKg%AO^&f-U#7g}%SN8R zve)i$5DI>#=Fd`iswBXC>oC7E&IdK6qYbj>fRGfR!SH*RZRlA^K~19?eam!{}fVZl3q5Ef-;|kdALu_9Gc`$II+iy&b<8ka)7@Cq8dIFxVSi&@)ufg zvSFI*sY3n7)nm3EW4f!wNHKt^BvS9+9va6k1kJEvW_pciwaQTD2X3;>K($-$`nk6i z7)kibE6^;f&3`tP#>-QX8NM3En6C*effB-MX^xNB;X8MmhNfs9`6%Pu(I|CYNW3@P zjz#i4O{S*v*fpdD0Tg9!6h5rEb$9(_FGU7_^6E4JgCBOj- zNWa>AI>2)%W{eG-8;C#)fNZK@K!XO4lTYI&n%1AujHDS3x8P4r{Jw{}<4~OZs#bND zrBU{v{%DQm50#T&zl1u;fVmFJhI^gROgRCPS{~#7t zk@o?3m_)tPM1SQlr+u^msa$8o#yRIAMy>iTpn|AfK7j~|l4GhTyWAZha~9bx~Sg56$@47vavRYQx z0q_(7Ix8e;6x#->l5KYxXN0-*xbMxpsJnATm-V7sL4W7o%V<_`uzV-TEDC{CZH@GD zAp7MxRFi117O_QrYtD&07wdLXKnHxg#6icPYVdsJt~^a! zsQw|JMbdkkh2!n=yt+U^z5#Wa{XrvzMB-Xdj)PVhaB^^b>1?!!6-{cRx&cpAE0Dg+UNrZC#7xrq%abvh1J!cy+4{byc`-_ z9I|lRYD3>n!k)W8_A!IEtynhjP1Jz7LxRf!^xYY33OPO5=dP~s>=_h>0PyTn!^xu7Lm{}J(hsrm$Y zj7qm(P%@-P*!J!xOFZ1`jyT>viHM=OpWPCIeMkqoJ2tMa8L)&i&+q<*4&N?!auyQu zg?ma5vTN6(vwB%#Ay`Vp1_$Po>ga@z7nrHzbouDUWSFhm^m&Q)CrwmM`DQdR1AQgn z>X(TSDe84RT?Z?eV*%+VI3Kc~Ki!s+4oW*+C zfn@OQlK?Bxlm`4X85%&2d8(IsvyElT7eOp&ifFW>V+1<&mjfcw3x7>Y?6y7_CL3Zg z^VS`|w!8HXabTlNkUjEi1NgoFK$e%Ru3^WKNgD8|En*l52lI0|%b1Pdxh862U}b?B zC2+s{yfQzkDTjaxN|JivS6jQP0yA9SgA!y%EigJ!P+cmz<){u{bgGDzQMc_8;uOU~ zI+U0Dj&EZ^jWlAUN5(B1`Vr>+TH1Z!%1jY|87z#LSv6jGne0TKG~YLEWG7<3RNQl` zPW6WH#{Y25s+}g#g!AQvQ8$0Gv)=RDQUlOWX0q1Xv3%V(8SCPUBqTOSAL`#a6cR$4 z13FQadZqtn6IM3AqGxl}?Btv)w^E_I<7vAo*I|HH*Y%yVOa_XcrL8FmRTYfOr|Na6 zO%53<6V{B(?%U^Xb<%O*btG1N+CBL{A3Z%+otfc7y_$Fh={jKGeE)0v9<`f=!-S|M zf8Pb(Of(i%dZiV!Xf?r7^W0tt*K_`t&}vsP7Z$Q|?0m3WN-lBbm4zoBBBgx6{qahp z3!zh8SLXATX;&mV6>>cQxiSdWdXoQX7T1>jiwjyWIy<$#cMk3sM!YDd9Vt~L-U3~O z9bH(1n)SZ$=^SV}5E9a!7cj&Fp`H%YdXe5+I{j@Wlkfu0)=R-#ZLaG!H&--9RmH5^ z#8&)I3S@5xOqRMXf867MO3mNjUu;@_=BIg|x!OwR*3P&-{=1fkAF)WR`6vk9L!B9w z0UAOYo_k!eLVgw}R;dupAVv`@TA)mXK3hn&q_A-p1|}Cp%le zb$Gs2;w=qHINT^t2~r8Eg<=m~sM*w}F+ElVHCE?@eT9d@uM7k$=syg7kDl4>9Ga$kQVzaC3OUn?m zF|<(NRz0SvQ66qj^6XdPoc6&nIkFvST7A4lBC@NE%7Pt!gUi+j$3VRLT{pyb7|N6d z4jnD=$gVDh)ABzKGiGZOlo@T<)dkPF01b;n+(FLKqv??`C*`y*!B89`Up0FE6+e$@ z-5M>ymHFm2=spG@(|aGE|7EGnQu}4>;ZHb_IE}ZxoC~ym>&hV9j%S!v+=yK&`GEfp zwBi%y2Vg)c>Kjnwfg=Zh4~t==(ohg1Z5}_Y;xrn8+CoHN>m8Dp+TBs0)Ig*s&Y?9h zSyRvE8amo}l&tcWn(dYcM;MZM#;nIT1Jqb{a5493b>A^H9dm_;xO>`9AKtEQVllu@ z>H5yz>+f26e~N(eo{DiRNg33!#mN`yTu>*NELwAJOO*E+2%Kq%bY}=ssEIoy;scbM zNh#>A+0e+70Nzv#I3Iy4i?>mPqu}S&tZvEeIF|Zzyjd$t+zGyWM1qVn&&M6)VO1J? z$>5bX3Y)){kz`)MqHjj*{YWQs`|~xD$Ew&=&MrLTFv(TZTwRCk@Wj%lY6C%bhc?;3 zr&)QL5-F>Tyvfrps25HPKaPP(T3<%TD@MqGisghf>Z74cQ_>YyvMxy?6zU`Ka?&p6 zY4(*Y5Oj8Gu&2O(@hXepc%;4{Viba=Yk@>v{$Wkf^%EXgMLySn0_vuWi zetpGm!H3qKr!07Z&uh7NnVv6p5L-eNkl5>PNYH0CYpAwIZ!^i4ga!sRts?F(ruJ9< z_GbX_F?v6p-f>^GadFmh490u+<(oDEhBIuETQtU3!7ox+wIA(JxH%%d6nQw5_FQ=3 zV11%QWnp;+1vjjx;zb%GTd-a{{dnrtG`+WL#RdIBut>GN-L!DIXE^P2)T=eSshyy3 z!rV80BP9gxfjqUoG?@^=NL#uf~ocNhABIOO)IyIYJD$d9Z8e5 zF=pTC9cy@gApB_}B~`dK0OLZ#FY%!#i5h{WkUxoSg1ULw&k?U&-=pAMkYz~vea^uy5mns2z;&T7azaDpvc0$O1KJ9jO}4t+-TW% z{elc*FJlhYo09(;uH-1srKEM3U_jQbNRBbk8=(sQ_r(;5rQPB(Xthf-3 zD>z!K?%+JJ+pP-PU=|GYNdk>psLtJt0l5v@Mg-_PZ^dnD%_3`;L1w$9Y&!b*El41g z0V=E*muP0!XCLBNwuTagdV~}kwaa`U)u?mHA~}?L$Q-{Iw^T&sIUzj#09*^OPdHm_ zfVJL;g2vZmIEjTKxKB1EHKAT6oa+KSW@+gNh}ZRq6xC;xeOcz5yvR}iOl}}-3}bFb zD1g6OQPF@i6Psj1x$*xs+RgENqx_ z2I?Ja`KfcQR7!<@STq$-&SES^;|8CBbf`CB4iyj;lHbHRItw@z5-GqRU6TdwW!|geI`~LE9yAOSp-N9;fM=fGGH#9Z%LT$3$ zgzIOnouj3MV>XaP&Tx<(C8`y$xD%`x%x!3&f7q!^L}TtJ7sIF9AkP4cI*bNZ6ArpN`vlDR1CKEd3_n%v4&Zkcxk6Bg?7&9ybrR9^ClRSnr@fOA^ z4Vj`GwtCBI5Z4A_2=m1CP2|9<74V_L}7P0_9RxBd^yNdNAXyV zeYdWII@f?b5F$G!NwK;0u@0hSE`dc-So-A+vKlFD#Oo%4IaD+-Mua*o!MZaIluSps;3Bx(KsLB6uyGF@wL8)j$8Eq6 z=XwZAWWm_kT{*`fupfjF=xQA21N!TykCeNs`b0^p<87FNA2yVE5v^askA`B!f}gw)_^>94_BneAZfpi7pv#uy9jZH{?>S#!3kvx6QpN<{ZmU zKo8w(T?Zp%);z~w;LAq(qC;8f44YMY3%B(I^+t7%{v}~wBv|)iR4u=uMFyB=u$nF! zEcAb=1Ra?fBhc$zV{UAI9gaOpgQw^%kr>)7= zAXp=G(z>Q3<_;NJB#}tPYtZ=wyI*sqFBk+DrExyd&}t+KLDd@#q#ajTlQ+JtD}1$L zuysX69iTR~q`d~wCCuUd+ulN*6vA~MDYBhWw0SAMF^T==x+4b+j79`_>WZ2@CO2dN`1ljxbz8p3!JKlz8>F`9|_N zKG`fPys36g?{tL(?~Q7lA0e=E2(GKdLQyk+`&ko&B=vcqBH2{Dx~Im6msO^o*=I z0fBXUcZRnOgkwT8|Y z2MPe6U1(z4whKOC)(Nhf`G0G$kJfl<9C)2iz4J|vD)MIt@|VQTj!Q=r` zR@k)gHZU@N0H-lDr6SpFapS|d%tPzLE4XlP0+o3`B;4ZgYHjLPoQcOBVCruEvDEv< z2qO&SnuHx!noUfa&$}r0%Z%*h!4XI7;4Z_46r8+_-783a(Yu<9>1xU#AUXE49nC6= zoR_<*K_dDjAQ^bsPQwhpjM3$!B#Af^icofFs$S{>Dxu*&^TB+F20%1eO{X+F$_DBm zG*++zhsZW@ki?Xbs!uufLg@}67T|7*QnEK8Uu_!|ESaCK*DtCCc2LdoY36(z@u9N` zC?OSedy0HTJ-qt;8oQuRIN$Mw#Z5XFv_yC(I83hWPwO&^KAysNBqKz9LX;hmq!Dda zNmnJ&;q!A699ycjS3uYkWg>>FHX;QwpJoWEkt{{qDabRZjL3~KaFhDh8RRod?tvSq zJGt(u)^$T)n1=HRR!fUSWxvc^S?j2$(_WxIi-&!Nwq89GR_!QU* zP=|O?Q-I7t3_Y_PU~uh5%i}{motr{~$I!G)sELgEEAF zLT)=Y6uCC>V(L}ZE-G0skOn@{o}L<*zc@ADC%7*;2f{%zTVPUBXwJbP=L=&8!i@MX zSE%1JaRfB2ulEfX$8p-PNf6Q1Q)pi-va7YrRW*F}&!BY$v_LK^JO5sP?KjG24kQmh z5+3$zf(P>!aaXW#yzLtoNTZDojV)LY{{wLVg#}Atz>*d_Ji2UuXE9O?2h&uGpiqz0 z!u;0V2V6(_2K%ws_IuWcqZQ`7%#{yWhU#(|m-*C&Q6nYjM~B$~{$tOaM>yt_GmK-^ ztP7DOS}!EJWV`sP04xg|CxB63?@}UIJQ;CP0s15AjL(Y)=-qO6k%!&a9JL%b#pyRI zUoBAF21Yp95FFGm`8*bZ|68ZfdmGoQbZ?-D82pHGJaR#wRF%$Sc5X54zDB6I9D)EG zjze&42BNP_gZ26H^MT*Y9GluifKpiGAsY_-48K1vG7oAXsrQ-iIm;*d3EdTBT+rca zJK$RM_ODQj*nQ~@0DP$pc(@tdz2!7(91B;5fdr+3z9d=>>--9PqIW8wFRx=NX zcP!!Af5WDh{-IV77uG%iH)_#V^wnrOk=Ee$Op z7=6YwfpmgAikSDe0AWAmhtSlxt(WP7(ZnSPeRpsJxwnfyfh!sb0N z=Ykc*O;g;%%)6*Z8VH7Ip)PIXKz0`k(%&? zV@6NntD(FIk1|>RA=yx^QA^@nlX#^zQ(6LlpfQR zFW1uMfs7x14?6Qe;q&8~k~FIbD^Ta_;TD&BLLv;dby4`f+fpEF$Zuf{3T>)Yals2- z*xs=WbZVi|#zlG%PMD&XsH4>w-HA*8L4~GNU_V!3N|FVQfH^OuIEdgW5fc9S*cux5 zfF=7~7LJoGHu#lVk<@Ij{Pah+yAsXc=&uIP)Q7>|cHOh(SRC_|4~mf!ic}9YB)(EB zmA~EmyhB9~uSohMfGQR9m#Xt%Z!>Y_%(qVj0zCT7wCu=w!@XnhY>LJjc)c&*D3*R% zBKy*bN*A7R5Y#|Mn@fdYN@)xe4V%kWcevpPQC0G8qU0YRLRrh)nIB}An{qkLQly~N zDCk@d(KZbfQf-5?iasJx=k{#kjUtm;q4Ah>YW^;iT7@LW6+x~?-6y{Ho1LsXnmIk% zn%~K;I?=t!O01aybrya!MWZzuS8z8uPzpa0y?znMGA26zZ}Y6-Jio_dv}Oa#RU9SH z(huf_m*Q1Z4s5cG?;7%3k2u)KCix&o?}W+B;}WCG9<_NM#7g-POlZ)?Ol~src}EJT zD7=V7!zi^$NNXE&3vPH^;6}_1vib|Kx!}9} z_5y46FkB=rb-)^u0+r_>i8$1fkl9?KxlZ;X!#DPfdk1a9LOrN`x}LgpNJFJ?9x~Ts z>092Y1k8@^TdD-p^fKqFM2Dgmu}VmceR^q6JpMMKk5_Ug8Ln>1WeX?-7}5 z8(p)`tDu8H1cXM(*ATdkwSUmGzWGC{0QBfCQ}>v;;6(p;No~SNxo&TzMCO*c9-MaR zK>03aq=I?QEI=vP>=FsPy~Dr$vmpG-lEQKM)fEbRA(p)?3l^8hw&fr`9rpr<(SN(F zycRF^QdEnc0!1cUMoS7oC;Hvc?|g`g1WreOi~SJyY*O%~*RAF!cG!OEV1bX@>HVy- z4k{y41%MPp~?dIl^&@no(84-nO>0F8_J(yb+N@`O&gZ<-koM4VG8ZV^xzJCncR!&+$ zto$Ct)uwH4pA{bbAQZy+`bPN%MHWOtOo3GgRw3Z6{iKJ*Z&dlh7DSv0j;Z&0`lH|q zYO;xD+!!#PZbuU(+KFq&d@j$-3polwfpZNbN-pDAq(?MFUNhLp&TBlK&XXASR(V|w5nTgA*J<={~ccT0VsP7c;v0STnf zzwXnjAtLCB5ZU%`0!yRGsj0x%Tg%!Y#|5?*c4d1Hjy6K{iK(7~u^!4y0&-9is!OD^ z_K0_1gv~WV5fIrDJJ?jlHn9bTMcfT6d28?3FK4mFKWCP3aU8SgXW4~anQ^JnK?2p; zO#)~dl@-eUnL=Mh4-?W44gWAZ%eLHJMDwUk=`v;J{Q)OXx|P696@Gj;P-o~I8T#5J zIf;tPSp)Ql4GEW*l4$vu70=x{+c5<1+Siv7^@w(Mj1fd$|k>Ttrxi`|T&OljYJCeqDU9`YP^+5pIe-|kbFrx)j}k81;7*C+rk zL*Yutg7g*ezj($-cKw_sQfp4P-}qN7ONRi6K06BMc++x-3g5m|5X$q(k5LlpUMG?r zZOu?SoJB)WRquv3*gYh;{{eQr*Mz`C{@8t;Wt{qcBWCbcKVPhHSDO%HQYV@@QoN>R zVXE0*tQrfBZS-1mqw<06W81CrwE-8q-KY)=f>*?c$7)=w79YDLlz>BZ7@?GK!eq=? zGQ9&!vi>Fh`F|ITOwgr#aATf)h6>Bo&dhQ*D*m(x<&mf9ki6Go-Tko0^lU52+7F)927vXJE%@8P8cc6U~972C{W3 zKV2wXzg;jXbxi`^gf`XXuEpGU;Ph+9uQteuh9+@m^iIr1Fv>uLctl1J)<1m>TER1l zbHUrNWrax{mMG-DA86?CnSGSSis4_HjBTG9`c|~S560;{Um(4JXO^JjNf~+QI!Xfz zsB2mvshIiNs~7@mQMyS4?gKXbb<-+eiQKnPT0ck#bh;LbAh3vGHGLu7)o{ZNoOr(X zUuS0ZpdrO85i^U(s==853#Ap}vh9}Q4Fm`pF==eah$w#M ztEtY(8qDq$L>j4K>yJ<$RB{Em5jCE(l`;`cRkx38(R*SP(p9_}Z# zBduek&#NEv=G2yLTqcL*lGgMc+dbXZLI;&yY#%G*hGEpO4mjr1+APv_`RfV0y~ceB zqLw&9S@P7;UMp#6_LaL8GVXapBf!Oi#5_K`+5<#J%*3?2C`}q-qJG>;YBd0=zMscp z@%;$MrI_WDPnP|p7b4ezAvEh8$7GV8E;L=c0~0B$6!ky> zpq%c;$mfYMpyM~AvxT_(@Uqz~D8kcyEdz~KNq`n5o6Pm^RT+zVBkr}rAKqJa+Z zTKpRp_90;QmQpr0KPTv?W3;m}MpmRo!ds?CDPLAN(#c*#snsihCiQmt^%j}u=dp29 ziCAZTp2oc-Lwb8Ak5cP&dQcu9(qUq%MBEdoe^MJh3PJQg%N2J({$NMD#?)iF_xod4 zdh^^j@LW%>fkhZ9)ph^~M4Yfkui^s7LEvKh#jC$Tf^a_9t`C7>YLEX-UyG9I($;U-HV$c!+S!F$ zAK2*4u-UQ8(Jzo>`_=Pza$hivW{L3nVYZzFXzv5#YG5VZa^}ArnzAbH>nZi^b8E;K zO$zrG^Rm8u*tm=ETx$O*NWDOAu696~TFe24(mcmQ`t!7J^ru!?lC9NZt|SHLMW@=w zB}hnl;|XT5vMCKmva$% zS=+~#tlw#)(2O7>qAI^h7L_KzGj6h~CtYSnr zXbS>=x!e7970I#^7vhsNG?)pxEc!qJ_*cw^aexWYh$`RQXZ^)8ki-J*f~w9H&^~6R zW6)3abduAz>Hh4nt{V(J9sfu}yYWcm{?=>#2W0Te<3W2Yw<{jpHJjclZ5!T)7-zz3 zv={br;T>@5v|?-Oj(hGfER-sfZ(!Eg^T3wdtQ|brzw?`+s8$$mQ z3WDLyhP6E*$zi*y-yt@{W8js_K?bdNYQN{=?#6!hjqnxb3i@X1hl>hkh9Q{|`$n*w zfZ^_S55FZM#@37Y_5wPC4_kg1|5xM|imXbc3QJAD0;km|b^JjT5KQJp(b~CxDa5xB zXH}Pr)3E?;7xf{p1uW!gU%Jj}hLAiJj5h5-DlieXR7GCNo$Hq{*jkw;tD;czcO17y zATUo4$HFO%R#X2gP@|x^4;+CrHE{-0i@|OIjSx+BAEmFn`f0F)Q2D4CUxcGmYR%UX zIBC7<<%|VQ1ZWUTMAgtQ4_=>-Yr_b7qb`qm}{iD`s91#}00R zDc)=5t>|~4$uC%=4`PZm99NM2zF)D79dh@n8J(s;1YBHs3-NeI$DWMfrcYM038ObH<=KrYpig|~=(aZ>*W(~sNW3=udCl|g61o3w#MfWl{Ri_NV5 z)X8_Lo6I~U%Y02Sa!~|pjmcI-JHGTDfUBqy!o?T8IELZ3;hNL1NLE>a^K5pIG_P_* zD7r|zv#Lb~@+<(GXCJ2MKgyrd60jv>Akgx4#;gcDXw$pkw@SlO{oB4NhY1zzjW0YZ zW`d$p-hY%sdmrg&u87k%C?Ae%YOkt=7yR&?2(W?oRNaWHZeBecZl&(IpQ_nno-h3v zVd}NX7@VYnEa>fo_rNzv=0w_cuj4ba$tpJF$(e~GNJDQ94mDp3LQ~C0)Z^m55&Sywy-qSxv+XG(z|H#v>A{nHlj+O)qP6if!kFEGCI(KM%!rGTl6nahCDO5+-t~8GE&y5nUxoV3?Lg!l)6$QX`10sJiJG_yrSD>FNZM&Cyb>p!};JTmbs$Uq~ZaV!0V)eyr9rF}jFwiby;K<+R?U zlcoFwEdHMeEmq48Kiu+-6i-M!A+)DuKjKOtzVn0}ofmA)jw3l^C@ceZu}XCK`;5JA zL}9urSY3yC!XOFNg^3lJYqg&sExBm*5qd?p7D(4O9+>jxRj@2Wg4~av_2e!h9+lnO zxji6?QpvboOA9%*Bm3CRp-fT)hb0$D6{OHSYlI@hIVvz}7`bM2L;S7nM=8=iE`L?5R$)bMtP@(|PJbXGs zFN?Tv^L#*0;&y71Sa_G77;&YqeMla*@Bm!=P@9wxoLPx8cKB^eg(~amgM9+yQ2&2u z|0H2d+1=w5zsanV`*6T(MAwOQEQ~fO301Rn+n4R*F=k#rD%f+)pN@_*js@DDo?GsK z;I6F9xU-4jKf)+t?Fa1g45T+F)ZsMeMVvOR2BL}94(J@UcPI{Arh$EpwMl^mbIgK-;z{8)LYj18K$5R4 zg;nb?_^vK;b?gaP64EA`JL8hN3L^hR!(p{%YgJA?!#{tHE!IpJCGdtQ=(U34-Bu#D zbjRkvNV~^8w@n)DlF&r5-a-(%|2*L7jk~avLbO}1PYc}IV^J*S4`&i$iurViJve2v zm&U45f*nbniX|44#nNy;6E_~UVuLAX4q65cF_27j{nX#w?=ENm3gvPamp6wbqZyc& zHO4E`L3A39%*V}^F8!N;vJqV95p-9LhhuUX7vHo{ES2$zCg|$ zx5Cj`$=IZ8pegRM-+`MP!agmeG4c1i8M|@@@9)tbio4K3*c1w=D`j_|=rX~)aJDfb z8$+4;H*L-!GUfu@NTe>qDjiEvI2RtOikW!Y-$VU`;#4njZv6i*aRVwFGPM6T;tum2 z9No}TqtLK=i=0=frP7zKgBn`S?!ZlShKQ2e zv**Cjc29TVUoeI;@%Uj`wBvHWiY_!nlA?H+(IJ&rVYv=4N=c~k$lO2uSOZxKj_?)$ z^CuKuyO>abh4^8?HTkRCxm1~55`x*^@pDBHm3nber%`fIVVtW@S?q2mkW8p`HAdvR zG*aZF4678+?wMRpyER*^%-t7ak=a5w&|9d;N6sU))_J6UtRLz-OK_u1xm5otF@`}A zhw-?z^+bnTb>JDyIhJ1E_v>=?dTO$_TR#2mK79$kBNYBK{aE97RC^~1-)&ASQQ>wo z8~4l)cjPQz%k3gkE76Ea8ZiZd)_7bady@GLV_)hSGA=ZidyNu4Q|uG3L%wT*@AuFQ)gkhRAyX z{Xm7Fx3q$Qb{q{1+e|S$dnBKAj0;Yuj0i5>A{TXY%?lk}hld!Ms;K~*!k2K1m!8#2 zpy6)kW^-{)?A+33oE?~WjP!qn`XQ`Tj$t^VsZX)wALk`i;fZgJmY8Y@5Q#~$olT|k zawTGvw1aUuzEERu_2NC?QT&rR(#_)MOG&Ye4qG1w^Vs!>5-qLy^EgB7xjD&qC0g`q zSr^InUpRa?D-Kve{n&doF}?SPBnasJlat;4D|$#u``ynqvhz2AKDQS`KG=sLauy%7 z9uFw?@5xc+DvD7dw7(%dgBR%KjlAWa>H5WyObWekj4>dJc+Br%p%x8&dk2YFJPqEL zI8t=mFV6W#vcw36o`t2jU^&0KeAo@#ze7d)L#OZhQo=k20Hh|woC z$sYokMq(EKf6p)!R~x9FOZW#ackkPJpaNqsy8)|}cHx=X?HJ668N4#sm~1&ina5!Y z;!Y$k`%pk&y|t=V!mm?+08XwF3Px0MjM+2+VKmnJWdY&-A9P#{6UoTq-co6qhb@L8 zi$-6fC7eQqiz>O)k$F2f(!y|lO@pzFPNu$Vf9gA*2#ir_-ghrM>Ff0YHExNUG|JV+ zcec~>{T>NoY=rnzKJLo#OY7;SV*w+Jjx zaM_vWw;D(?DNIq<&Cw_q-`?4(AqjhPw&}A~=)>~i-m9@ZZ0)J$mmvrRDR_jH+{$3A zppca;9h&e%9(hKutqfB>d;Vr{J&acln)`LOX8Pg{YJ}TUqeTP8^(?v4a+oe7c=Qqu zKlS{L#j6i~J;J;_Ka zR#YyBeemctcqsMA?3yz}(fj`jc)q_>9|TpckD-Sav>r`D_-~-id35{FYGWV!gMgOZv2sGF z-L)!-Tz}wdqP6vZfif8_JoYoc&uiKeW0NslOCLdIuN+GZ?+IEe@ZSpnDs zBGsc>D~bk;Sqy!0LY!jN+|zLe%!}W7xanm<-gcWAedJf``l-WVd2s ztJr{Ib8dySg>*>5&Gz9W!u(n;Ii$r?wS-7z{~(68DJSTHOr9dP2tVIa~&m z>A(7d&Sy(e=Yvt-P?N#ysW+TAPxVB}h#N7I5`b%Ef?^p3r63s;YZz<4KFtzfvRsSL z{_0v}ZK1hyP^!2hc?O8`ygxc`Lo7bNy#4LT^Tn7@tl&`lFziB zdCB717JAmKqyJLVp@nBwtmHU?8sV}2bMbzxvo`F+E}|{VGMZP}WeWwiXj&BNZ@TFY zhS9)Olb`U|eK}^zxKxi0C~b(Mbvu>{oylI>7L5tMLdJ?X2D6A5)z~8r!k*PfN+19R43EW~#NZh~9s`^ZR%$u@!QSq-*fV zG4u+j*h6=44Zy~1CwffBJU&dm3~8uuH0eeZwd6S+Az!gw{ja~jn&jq$CW{ABNc z(T;Sq6cA8!JOCeZq_llYd1rA0Q=ie5u*SP8(^^oCXnY{{f12dz7I-_xunqOUpmfO? zPn5T^#IR2l#clZqJ`RUp&g(E)Z0OmaqfSh^mIQS-qZv@UrTkbn^3qXzc)tYeD;-B$`xMW8chQRGqmr%$B(@VT_4hnL8uLdF}|YVoc8y{FiPRkmvcy z?0g0PfP*9vL4s6>3YXnpiK&nf)q@H1ctPzwZBTRriB5IYliagcckfgwe1Un^7nS0S z1HcaPS3Wl>vDVo0*bhOajX#mX1_t&7R`REV1%aLOE+9pu+yFo=Y3DW;kRyUm3{O^_ zF~^+i`TiKn(rQj?WcpI{#;xpZetT+nK@}$zI=z^l5v5p$Th^N1Jw$7JKCEIWT zxbQGBc$;6ty$Jz3ejDlpKkioh_3VZsj3I^nL{?m~twChd{uX>s*mh(u(r_|7J;~Tc z-GdXoR1?hu@@z|Tz(-kd-tZemX0jz<$D9Culi=_|i&;3o5~TMh{ZhQI=nYAvQQt7r z%~28wT7~-LU1Az{H|$KTpyb5$NVjQsUESNS8pU5?sIvhQQ>QQ(QIr<{1+`v8W>|(N zfsp2)K+4zc0xBgbcRI?8Qgf1Yc`81`;7k zx^GvTKUye58{v|(uMcGnXZxwls;C8{Yh0eBY;EiwKrQbJf$nHyh3p9 z4O<`!2ytMc*1|`Oq1k5bty0{6I4;G3rz=Y24DM+f=?H20Q(AQqzRj5kmHcTBbrQ%6 z_E3vWX&dj=fVi17-Cawuw#^0hP6B5yW#7fTrlH@QXZo;IJzp+o^L8ZW2ts*lKYbAy z9dY?LV_O02Kh~K11Xg|F$RNSHx@!>|bNT2-{4pusj(MC{{D8QQ|P zEc3YN_kO;=@bEfLVAhQ=p4IDp<{Ka_hy-@UMoC@f7z_O~7Mh4R?leeSzRev$&5@el2urNvxov&@%wr$(CZQJ&LZQHhO+qUhSmt>Ko(ld*x zI=!Eo?&RTRVSiy`ckPU1%F}Nm*n%+av4WU%J2}3tm&`eYuwQZ+QA53W!PvS>ag2 zDf4>U)c}(idA67p6br$^b5KaO@~FJc%P7U;7!#M7HAu@OYC_h=RZG`BqztY|#a;^Q z!)_}oGbMiJ0CaJ_r{EJ&tJ_}Ry==LbI5aNL`IRS92$A)fts2s}YCGTqa9{zegkfYk z2#ZLbNg8&8anNQAnh=hm=m4ET(m^d4X3mBv*#Ngi^DE1v9Gj)+!a8vJs-_Qt`)7%R zMo*Zns&jS{;CDQgklZPSmST`p%d=1jbKb!E5|NJGfc{ZnwdKdmk z1aCu^%iNGG9?=m5&npGI-_!sm)E59gCKxrYf2Y|q97LCG>X(ke>#EQilO%upZ@emX zx|Jo1UE>&(({9Zn#MNw&|AE+EqNhD>li_~3&G znb8o|!HNnR*;?5pWA6v|f8O zn8W{MtPXb&%4ojp^SB+a*$o$9l;Fv`q5TW^k$6=Ci0BWXyK%;C^!G`IL!x9XU1?EY zN5h$^+F9<{L=r5)dkjAuOaYopb`35nucN=m8RRP8^ z+hC_6AX$;M2;+^Pwhn@>6_BjzCm?(1VhGa~9M8JwU~R-z7`K%?r2e)Yiqe;@u$C)? zX9`%6G)^Lw0mvBp!5>iPkyi)LMcK1%R!m%u55%zDR8mp;BTj19p|VX;$7zHp;muu2 zxBYmoxb2t8tXpzys;kZFbBtl8byb_y2xBU85`t{8se1ADju7?=^ek}UZd z&k*9irxWqmzVB4&YRm|taY#XJ(I2|MHVZp?v^WWjKXrFO4 zwe-E1COvKNQ5N1frxz2=>$QRxW5iZlrhfkq?_l*SO_y%wq2r(naz3$FddT*6CJAc7 zI^*Bv(N1e)qY`!QIYm66xh}u}N-y+Gz=v6Jez_ClZW{6{P#>kWJy)$*3TzWb9_?`O zgX4fI?GwizIBSNEq4E^~f1Tep)~NSKKnWK>JOB$mO19Mvz&%An!N&v@Zhn*>-9RoH za!>$22e||ZZ7H#VvEtPf%sN1TbD#`ORkCe!Tl`)$WxWd;btAA8fj!*Q8{*o;hREc$ za0VDOVb^H_0K6y99?|N$*ZO7Nsg>H_>CwoTPo;Cgd9iISbKnf_-&^MPLKXQSnabWv z{n5-4HPL+s28N%P4!+|80$1iHQMAbCQ@F?kCe=|3>;R3BhOZD z&TLqUtK_p^{oPom;(1YiY%b^K8)35EcO+pl6jWrENIw1&W<=veHki|~y{k=A;EtR< zI@t1uujh*~u5hg*@(l{)Cxz z*3WnAsjQ0eh&<`Rpu-xs&Yq$ZINL$iEFvci+*IuO#U@#S$CjcNvB}ez&oD3C>kU zvJm28!ub3EejrG{D|HOJxzCsBvn7w-J#8uE_?a3JgC|8qA3gGlrz}qn#yJzNq)Sad z>hVaySX05G z;oHdMyTakt&QVyl?;Gc8JisaoPYgDi*q;oF&-XLNc|awedjUa39UgSnpOF96 zSp<9!yXuv^zK`IQ!eW0=%*3+h0x#aJy*QFB z_6@5jQia@wrFCOE)eH==wqW4dcC;ejm_=6A)_&eZH65yET$NTxXoKYS1$4MH@7qt78j z$@;Y$J6}dkKr@syNrMHa3yi8nLn0H;y&KsfBCwZ5-Xw)T;jK*A-oZ8?zw$V*xFl=J zx6h)TOGV|*Qep+xBzH(x`!h#B+G=-zVFqy-Y4_V?0fUG@)P4umOi7O%Ex5Zy^7Yqr zmT_HG>V7rK293K*Hg;deiKjLz@?xh{z9EH?0PxhrgKzv!uIdIog{$%FWZ;WBZ_#RE zM)bf|068#9wL_RZA^8pNE59m2y%9B~%0zjy>)|AoNo2;Bj&}n&WcY;gamXazE~KwH znkF=tStc;m&d4@LW|V7YCvB8TT~ly?F7lhjA^tm#>)USc6YHX4uPBoBU8rWL!@t9o}hLg3Cr0`dB|zSU1iui-zvu_dL{u^bgo0!KNgtsD%@~xD%pDlQn>;t|RDp zALVH$X)U$>9C01$@o+1f-Kkf&DF-j`3R>3hn&YNUH$b zxG|#h@ayOxPkR^UXacJrXjco2?BHWl1I0Jr8BlTJX{^SvG+C^de~dr_(@xkS8?WY5 z0|E1;EJDTU#C>r(duFSfEO#xIK}hDRHPbS5Ot933e~OK+3?1j`YKd2&WWu^gK%B_W zbE)9;YYGZ^u(!aPmRBT^A5f%+6mGEry!&KaZ))&pzU5mZMRqq%r-oc;O6JHDQP74= zXUZNKMX$_k>{cy{CD7{Tp<5j9=7qwgI~woxiW|^K6PO;LV*f7+-94$3bI} zymY(da1v5jnE1)^Wa#oVX14^hVp)4pfSoxYVe82_NfY7=*#S4TH)#Bs%Y{N4!X#(6 z&XJuL8ZLYesevseO$dFQvG(cJbN$8ppUvLNEAm!JKcU9Jm)?^0&p>P0Cb=IhK5tPr zPg{DYCsL+Z*t>Y>rMd$T5A}zh9;QCwERA9>m?kyhM-P*o7rvoT8d(-FFk~k!P6w_TJ3&;Yx}NjD!QUcc~P%I-{WgD{)9XJS|%&9X}8OQMV23J6vp~I;o*)`ca>+vkP5VY75*1h76 zou!F*mjAm38KEAf5Fa3=xWqU#IS~lulEjvv1G68rSF2ju8*L*Y`jAWVqMhQz+HlWz z7D1O!(sU<#2r7OyQDyME7*)90{d^oW6>C@=fWVImZ+Nn}!sgvOlsx~GM``%bFgdWA zdlInH8~9`lYlaz)5SkAsqO#5?$96w!>5l9qGtIy&C^bIP1nV9-wwf-nL-vMoPWiYP z9?nL~=1081cj&oo^fs%jKvr}q^>7uFQ?GBkl?;y6cy299f%-m1b^93wquu&BO(xtM z@^cl>UVi=^n;X=fg2bbwUlI6t-l=0!F>3IMnKyQU8P)kjZkDrbwOOxj?{T=fzvbIM7W#H$iG*oWmf;2&>$5T)a9RXj^^sO9scBIFLi9VXk9}4S3{Lkr(^=3*h z8K}iAkVLL@)z3X003|}nQ6DyFTG|i50zr!U4|c)$cs7Ix4`48%jfzm6uhFMZ`n*G&1E>=yNdq^)3|NpOrFM7tZQ$|ipd$VaLoK#o-pZL zBTRUM11X&rhRQg+yDIG-z9oo-3{IwknNoT5GarrpyXiS|+EReHjOoP(a#oeg0G3iFS%!O#Q!;0icz8n0 z-um1}K3(d#)d|fc9q`k%jw_Qei^#jiQ%q!FYmrmt$Izjtmc5nfQazNlCs!m%qg(`` z++3R_?!a0Ap^n~Mwq!%HhD2(AHgm=dkmDsE6N-Mw$|z$dD>$w!r9fAH83;BwHAlT7 zLVh2NrA)orhqTA3)>i~BjPBZ1g(W>EvsxeTE?IFp7{NcxIpl~3W$6K1N4g+^GD3_q zkMTj}9$8#~yo7)^qqO_Qdlty~#sQnNJtUVL{J&w3#!hG932YrNyc9bPmCf3ikyw=# z+5U!;?BG9Gq)ZGuuFsDLc5RmYM!v}@N1=|PO=vA?(uR;-9fa#V+!wgTgee9@o-0Q^ zW=Xg%UD<7ZF6qPag}WX`Ph;}tS(rJQc7uPeHYC-ZwuV{FUG*duyKr;Y@;Nz< z))y(w|AIxy&HCv9r2dP1~8| zWM>>Ebmn*^uV2N^7d%D{6X;<3Y+UVF`D8R+H;QM$JD54!I+ z@K^?Ajt8%JUAg%4V7}vzxB^;_h%!!XDlj8LlonTu5s;ofB0jVEBkuA9G!!{VS`PSA zS8(p!j`NSa6gymmh0jLow-)Hgk#?`621PW80xMCU%#ACD*7x!Ftf&9VGN)bQlb)lUNdW5O3)mJsARQL4{g z&@xh)lJQYBzcyCw6xMDIL@>M5Op!I;_kA90Hsfq(%A}|{g|{&jq#mntdIOZst~A{n z2=BS)8Z=BSZ1IjxWSIe6n%Ax2dQ^MSf`0g{VKm_(`BSR+Q-zLPbLN)yP7j9p+Ad1oYUA4z(mq)}AQ^vurR!3C za3D4BDi)PwELU}n+6!J5Y?$Jw+jIb*A?4AyIKdrZO%w=2M?vk5P#3HpCp6QoRBuc+ z|51#J1vuNpF9npQDX>3?A;RS)%<_t_L;xJ7u=n(s6gxYg>{reox`9@48j1-wkVZnK z5z6b*4JgQ$6Me7bZ@n#Y@v2^?zVkxOA8DNlJmK9@W2}Zvx-GfK2a{^TfR9U~jbrbf zgI(Q3nUH~lC2f|~CN9lBgo0DdlbVkE^B#Q4=k^#^qH@ln^GxJdSrq2u7mR4w>o4sB z-1!WNoGt$IT^u7FmAA1C3;digrE+Ir7Z~t>bA?21UdVC#}}WeCUHgpHbi$0c3+g zv($0XTMa_ty2OzT15Lra3exwYDG(3hgRcs-%mybn{$rUZC>lJ(hYyK+!yN@l<)@qZ z9niso_}uR%glb#l1%Cd*3<6-mGw8VPn0w0Z+u0b}7!WH7Q|FujXFk;qWqxR*ylPWG zy`?Vfk86Vm(jlK=_xbjMy;a37l3!JAtu{d*!XMeXE($l#px83E|2!^N?o2$5k=>TW z7~fpL*_?Fs?$Oi)d(YI~dY_xsz|7g<7z(=9sEqtBk+!)Rkamwd?4S#sC*a3OkF0+K z7b+CTk3-Ww2V$HHz(g8?i~4Y#e{{BlaN+3w4^y^rX@uP=(7MrPjLs5gPB|SrrVGjE zA{A&siS3-0{q)hnM08ietK>|V?rkj=iUAeUj{zg?qUZ_u=cJO*H;HTutwx{7mbQD- zA`LJJW(D34npy6~_uE-tbU3(;%Fi~z5fMaCY-z>kCl6Yg;bfe;vbD=KX&1O)Lsk!38V^ixEHhl27E^S+j%(@hVK#Kn79Ea4QUen_D%1TXAf1ulqps*17EYK| zP_2FHw6J!Mb}}jrMlBAjM_Jj1o_LkgG5xRny!c|_Rv;W`B%G=X|BRPaaVlN>;3W^t zDU@B=DL!fvUI3W161ged$>LRzu!fnFn`wi$B){vXLG?qNCEPdCB2)&FLHLYGGCnU_ zO(vsEA#W6l?BwY1YdxR5UXZH*w5%}?J1B6}Vja^lHnwYMW+7&_x2dT>O6?1xxY~#s zh9*aAQ0)i3!%It;`~=Rk<#)By78)n?1Y8{=J^&}8J{NVM@u*liK+~%j%8#0D^qIQ zfF6wFjf}1`ixtjg~>c~;!#+t?{&CDK2-u?waI25|OrW1Rg zZ5EH`Vqs1<5`?5nyVR?0Xd{WxY3Sq0>NDbL0zfiPTmxG&`p6rC1@F3~6nUi1>6K?b z8Ay`OwJMF1LR|6i%^6~aBETXrPwDEvmEp*9l8yj{{R0t3bk8HU)({=_@Nu5PA4i)Z z<57b=Kf$k4{AZg>l(lS$9xT4gt~u9U=rRO)$_{G!ikd2umO1K6VVR=XdEzq z=7cxi>R*H9fkRGM_CVANIcUd`z7{$drGZC7kbi=tOd@K< zmSw{@4@K^htboF`ncFJqryd$w2heVaDs{a}^~Fn_ArGU|3_aOGvaZJF0Gf`5|4o8- z?jJmG|B6R_#G9kc2v^+I4FHN3O}kxFTEI}lO!CUq2$(B+4vw&?YnOh%V248%bG#8S zbHmE&9OXs16E;H>#2SdfWc`SeGscENN+(OgS^d+F|0T1lluQLqpXfpeb%p#6C zY77lMQTS}!)F2wUp%B8sm3Ytg3M@4$&*k$!n>sbFe-2=@D<`k4F)p-zdxR0ws@ff8 zj6nWz5xPf+12>$k53Tz-a z=UwKTP}dI;1#g}(Y7rCZezY+#65JpNHuXRiz_Xn-TVOd8tI2R!1Bmk7-y0@?%6pEk zp5H*sb742xKwRJ=4sbs=srMsvm5iEuk5a61XMSxZ2)PAFbP zrbUYNxkVC3)Gz`Gl_wr1Q*NxzuM4HkslB4K@}UNu67|ne6}hI?6)d02;9>aRl-)EA z7d`h*@r#kE23~9aG!hTDNJrY_9Smff^6S@&E@Pt)sdCa>v52BZ(wsK7ji+tVwyy zb?2v^jb>d42}Ln3Tu<+cO2HTJh7@u;PZ6Ss?lWO7sx?f!X;Xz)1(J1 zBTJ7*YlV>4_Bg?sdi6%yHPIFGFSWGRNZxv3j_Ksy)6Sf8#M&MN{Adre?D3#RrNNex zf?HXBjm=-F9IF&pkGfpOp!_L?qVO};HA_%4nGMkifgq+B)Yb-fc8;xEKR4j5Z=yYw ziq5FokHU$dHdcHv*C(a?hZ&z!&f3t0GT80}2qguGiqm~=SK*KcS7{i#tr?wnhIfBm zJGHD$bznp6Q3r>_pi{jI-GQ&)S~m(sZAop8G-$YX-1=aewvhwhskm#YZVb3UdbSz2 z;SHA&f|-TDKO&6R#3R)&%gsrlFljH0PftOg6^|!}g#nPor;n-?wU4B#6s)%$dn5%8x{wK|fJdl|ak{%i$1#RAmWr z#2EQ{)>ebS}qqH1bwTe*n_(SzzYjS0nSnJ2h^qzT^px z|ALV=>4*~HQa0ceKw+=QR-wbA zO<+FJhxr@NdIbXx`%I|2{Iis7+2J!b7Zf`RiC54)P&-jWuq?@O`mTkus zWS=uUJVzq@xj8zj&pwgLdXDReMK(Bsj+4z7GiHEOPl-5)fx4?kpIN8IQopon`UjuwDH?+ z9$i9-(K+-WyVy=5E%odFlPt!C!6Bwm5Vkw@C!pb(wJ$m27IwdVc~4M$&y)|wj>bC= zJ&i)7p&$`YU%|?!lhBmK>7Q?vs0YfC>pqwQFy7`bq$VXd0FOo-gGdJ)f~P zi-SVCQa-^QRr&e8OCtn^4w(Q_INs2$G$E`lD$?BGeDe&WBSs}%^xu&Nl(ULY^<}Lx z6zGtJC|ZuYC&w8?{%Ue+<-cS_;+%L6M0VVYXi?xO-hi|}a-faOshg3e@O=0+UCx(r z=wNb1${7&%Q3B7`@jVZ<5nuHiSF#WR=jw^ORq=w5-j6K0R|K|y$}@S&jamrTECt7o zPP{Y{yc~oxzpj(?fUj-K!%ISBF=0)d+K8m2f1OE*pIgs3$xWkxM&JoS2;V;OT(a2t zWMt|@1t5CP>>?tHg1kHBTehl2D_oU?P)aAwbwyg`7bw(gwPqHU_c+c-iZs&)lpMe& zyMdV9>nG5C3lPf)lav;eR*fi2v}PT_=uQg#rpTqMb1Yibj*X-<$%H0s6U5F@9;;5? zH(hN5a*_0XULdaIOJamcmgU>mNI|!n(KJW(9r|JO2JKz3ZD}O zf@$Lkb2Pr0;L7J)LC!oH+qg!iacsd~CplhOSPjbsrq=1TxP4`8G9b0KEOM1sL&;-4 z?By5H!4*wwU87b-bnwSGGFH6DUm6F5GUN428OjLu0KN8$)3UUu$c$QSLzRXTC)*?< zDJNb3Df~|$eyKU$s>|z3SrwpirYFLh-JA@g3rUO|CrYd|)E9#vML%~bA)m7fLxziudQcR4-=Y<+?m55{{>H zfJyB5W5Ic68}6GP9$9Bp@$pP!e`lC)U)T7J;bvTmK^#%5e_pu8ShY3$DT4w3wg|S? z%vib`JKhBg)M5+*Q9~%jU%lDe$MQWqke$l=cITddDM8uHrh5S8_}QRc)A-FK^&)5rKQT>~G$mm$_Qg(D`UFqlcNKqc;2{1no>U9xe_ZH{Ah^Z(=UIT{Q?OARqs=0Mj&ZDMkvjcX+9bjyQ4Qpd#bO*S7A-?9*MbTk2sb zH}vUfX;0$1i_09t*RCI0if(H`k2tVw+*d9X6^`EXzuH}GXA%%3t~cfX6txTHB;A)T z@w% z+yHKk%*tP$yqChg{C_2pM^Se?sdV*caxz%4@2T`I zqY+ZwukjaC=TC!RmJzj~-C5|_BBeCUUx#H-GfqAnnmAJ1tYUgqR>XyqOGhuLHsj5? zmK~RnhFi zU|OPrx}|=WDeF;I6*LgqwZ$K_atk4E1Er;+{Ve=nqpaS9z6AXe%wjK2`nleCEEJRy2{vkh; zrsHJh_ZBOfRX77>hP59;ksnVF3yP!Q51<12RRAFV5%I)1ZDtO@K9$9$>I9U9xsD4j z8W2vCIW_Oc@%&mXgQ#+`&%aA9{YI4sCvN%?NVTuQEX&fc7Z}8$x)v$CxZs?rT9)nYC^{@(Ydx>n=Cix4dOF-%jJN$<9#U<=V!H{m&GDMLd zMgV$`${R8(!|1buyM?Z7q$fg%mr3ID|L201&!^}5q=N_#c zD@YY#xkoAD@3k`<Qj?#$$sijI&8l4@55EUh^Ocb=c(vmq*8B5C_a_nwkCxmt zEb3x2ayELb%_;xxl=yUr>QdOXnL*(VRR@w1Ax?~m2A0csw-)#f1mO6B?1`F;<>utm zo4)f53?)^%QT(Tt*;(n0TX!FnawlGpAzg`RKTJDA^v_RW#mgm|dI&+>T2uFpZn{w6 zg)~)-2fvyek3yy~XSstSyiN9);jNsPf8l99J4W;?CYoScr`;~7?;czY8S;&vti0V? zxa|;9Ef>*^arWu^iEuqjzAi3P>>NMS7w9}cp6EaxF<>Y=={L#U;D`Z=6gWgh(gX(4 z%LU*);!3on+5=r|@?vUI0%$Wr_K>uu8y4N7He(G&;E&d0B~O<8Dj!OZ0tL)-h~GAo zEyFE^mJ~}Ij~(KGF$B5o8KQE4T+8qHFu?%(Is=0Kv$(;c&En5oev^WQXYYsZQLM%R7bcf7VV&L1Pro4L0MqF=K#yu zM!3uftr-m!Oym`Ryf-xcmxk24Hcbmnj%3w7+NKTOeGuCh+wF6L=YSpbb+F4RJ!1Uz zD$?d4yKPr+I4Wu0K{M9+PiFS@DCH2_QjbrLNDZM%4jKVh{5)ATUI%Vp?Z^z~vdm{W zU4k~iJxHL+l8RLL66ans!1b6R2%c`8TUmdeL!p3g8jCJAh3bBa<#WiL1s~rge2dszZ7hLbXMV-3&q>a2UmuN zJ~kS95?$TrXLeKspz02$)q-k+Xy!`L4{YZxPQ4V7(@BATV9`!yU+vZfttoz~c9z+^o zuPTX{$_hT3Su8m=bC!F*3j;{@O?zRFmkB`zZpVZkRhe#UZ)L#fO3HHz{w|~(dZC{{ zBJ@C+MGDq_e|-DTl8yE@kRt?1z6gR{a$Q8q6s`F=)odzwRm1y1+I#~jTR4sJI#J51 z8-QkjqBC7jPS{}*6cqc_c+Bjk+AVz!mA-qZHxXEXNP94{9NA2*Ax);~n}wdlrZs$T zw^*8ImyjFB%XoGtPdOs{>}Noz!l9tfzO6z5+OFji-UiH9gO>>m*P4M06?`Kx=cEXL z?qTbzTOUjPsqgYBEtEx+wl&%2bBbN|;)tw0+y>(KY38b7$J1uCJdNDxtx-b8xvEAIiwKvy2w{#+9 zkRV;UqMt9VI=8waZ|C0(GQBMzCIbneyCQh%US>&3 zLi^XK&y@;0E?0ccn$TDPS(NJP4+Ufq7LIrAixlZvS$5QgLfVDa)j2C1eN#~$H-MTg zi~8-GfGw?818$FbUbze6DN%X@Y5K=lb$yEcc4MK`K|%lFB^Jfh19lf9m&3dgH-kw9 zh4cFH-tsdsk*yF9`VUVQ`Z}VVuenX1b+Lk#00yg`)-aj2_DT`?yqB%s_n;#*Y=3r1~DCey~s?m-$6Cntr571ckFT1#=s; zhVuK*#W12Ww#Q!TbMdeYBdo}?QGO_9IRSrL(PJ)>0#~I1&nfO{ZM?jMkJdF+jXHL1 zu6aae=dnQV%ALyqvXe0bT7`Lm5WuWyz0J@graKYdNwUJ1ntS%YW}V@XHiH+og)5Pm z+i(}Sr=sQBBnHp$tA=$9a>TPt+eW0Nh2Yu_+Hdu4$)D3?hxGCLv-xgQQR>TAUmq)$ z(R}<1GB>}?ZjFp*9|po~YQseE}V{xWcE|E~k#x%>;RDCtPi zNYtr4+8|0jG#NTGK}y<;oez%1ZT(?JfC)P-&DsWgL8 z9Pz2cp|IQ90N!?0!r@V(7T4ADpm*{zy(lJfa(SP#>)9OFtZ`V}z7@7zjflnApS8s| zr?)TH*^cZmMG*Uwchf_rj+P983`9)^AR+tKA!Kx)U@Y3>56EFUdcCd!Y7D>4vLNN< zpOp!{K;~9LEsF#p%r>_A$}gpPK>E%7d(9PP;?4_F$JnmV(GV*o*s6k{St)9lBqNj5 z&TnZ!%>{CN!m}auexWJX@(sklt`{oB1n#(vN zg*@B3wE0{r;}J4|JF%5_17(Q;NEi_k`Ot!w%8sf)M~!iLEe&s{c|w~=!*Be(T@5`PD5>yfEGVh$uA4A|E4uVjrz=xwP5u$uOw!_#^dqdB)LtEUj z-gXWwM6w$T=U{*kq|2& zAZWR?&*`Yn;GUP#?FsNtWO>M@U`5gjPWb#L(xl7w^&?hmUtE~ z9Fvuu_!`RRH!wAezF%>dK>-)t4O;S-?cWRx-7x%@&$YQ~zY5}uUGz`Pb$eD9jXv>N z6W@n)HX1c1DHLBB;;?vH^ZM`Z5MzP?HI+b|%OwAC{vTQl^0W=eZCi&ERcNf{UY26jMIz4;7Net4c%mG4FZO;XtB{X-f?;#HuCbXje+!-IR4v zWjT)dH&LE5+2Xbs0&0IadqEzeKdw{uO<4etfe6i@az!v@VCNVy6VJ${C;lgV-Hb_0 z7pno&|Jdn}g%pmWx;6z!&)nXJ8=z2^k90iT#w3j>6E&C4!|(|V%<7c-c{X3gcqukK|4`Ug~NKVFhQk zB3F1_@$)Z;jC-B_@TpREiLBRS5yD$ zzI`4}QF#w6+>6yZ^;{r5_u}+8M=Q2{`&p?W$s&9G%u6>Ot{&*U5BP=`3s`!kb{J|8 z8pI|c*|v8_B3~7dN#H~A%zb$!(CWpbIm-jF=F=VJIB4iOeOrJ1iR9EtxQjBNGAK!( zkRmWy{^MDSh!Y>i0T9XIG>W_IVu>)Q!Y8bL(+5X8&FkZG+nbBfyR@!aCfl}9AY-*} zh@|-L*KA~ZWUHp3aGW|KtU~n3}2X_x78(JyLRH?N9H;-69 z=hI;} za7>0TWmCl%{xf+JlU8%m=9_2I;Sx~PyBuKPkK#6gIHI8*s`9?5e8fS{rFf8pxA!{@ zhTx5))wt)|AW`8DuN`KRqJ*^duyew-a0qlIJihaPdn?k3yF>6Ud%ofm_rZjBa4U&x zh?C;W?2SO$#=2~Ho4tJDEyaRV8q&cJgaFsj+59)D;iLMLbTj#F%s%_yO}xhn$pRXj zXH9Y-nC*$6A8<)w;m_XGI3It9-(+`W(L{qSxJV&c*0OMa`Al<-d!oFzi##5~=ps$7 zeg*^Nz+cp(1*uN!cdvp`Bz9f%rOGq8(;0f+VZbMg>&KrSz&MH9OSHAu1Bcd5)*xAN zk-zgZZfw3Tzs>p1VlQ}+???-N>`j)FbE286F)c;wUIU>+VCixv&!B zA}&QHZW2Kg^=qj+hVD1i?P-*hi4zSyG(g32K?I%RQ@{H2rO~YRy64_U(RVuN%RYg1 z^sd>F`QbYou7P@!)qL)qud1XyfDgA-6MH& z{8Q0}J96eJs*9W;d+SYyYCy}6{iy4f|L?^pgqlSQv9cFbzeGv*dpL1Z)gxy}_qrLc zuA=CUNJ=r^w;+MRcltT&8j^zl_LNkT?EIK&yk8>#t8S0X+W~CFus>$%ZxL6$_|_}m zP?n-r@UFC>PKP%JgFRwPIc@;ZE-X4#>=Kh;aVK$u<|I410Mzg*V2*_&;YOQ!?n`~G zERGttWS;v==7%r#8V=t*LhM!k3D%hw;jJo{pe*PE)+E2KGCYdcM(scw z?l=F}FiY(On%~2~bPTjmcc(A!j%_-hZ$5W{Y!fH97;`~`M8W<$vt{(0FGk%~@_DuZ zc~M|T(yOcfClkj;TF?x4tq!?GCpIpP9R0Y;6c0xFEo$wB1X+U0Q*aq?V=^%TLsdSz z7`ukmczkL214#2|5##M;=LXv>#4{P{<7yN>u!06mJ4T>H%0H+3ef0z2)*jKM!_SJJ zy)lSMFT%eDBQ|x;7qe-a?@Uc>X?|FN7Bgpv4t_9uJ9J!KnU@n+PmY26n~P}XkHz+o zXa9BpPL+tmb=Pb0G$~t8o?6dK_w{!a<2uVG{uRtyvd`^BrF;RMKSq#*b0W8KcQ1&a zX!Mt-1{f}3dp&2L6IQ4A-hdl```gkM1eXyCzXzS%KN03i`0eCg8@Ygi8%W>;f*3Dj z`ZkWtBNG(JIT6U(*PS}eMMri~s%;tRqugAuS@c_;-_VX0L=KF$96c1m9YU$&G`+q* zvKTifLb4n3M)GnvY?gZjRq+p-d##iP5bVv#J!K{88Ch&J%rSn zQm#CjBcTbFN2eMg<^*x}rB3*d@X@p1`UIRmYSLm`B6<7IZWYD`B<$XO;ix*x6+d;5 z<);rtiD_RkC{{|zL%aP;efHf{)GScUwg?O2uv>K#{@Yvu?s2wT3VVd8XoccZZRL9z zYq)hHF0%8N&&G#dXn3Ny%YOs#bnDD?EHRz%UlBSg5_y&hoYf}bjnt5RaYVx!Nz^FA zx{L1bmd+n-!k_n92zIV0l&;@{t1^X9NFu62@`9A8#w?1=Xy(cu$Zw9t;)}S|i%hsv z20sf~+{zTIKKng;I?6K5F_@>bI7GhW8U?rpjw*L*B9bAG1G4BXzl0_UdS`7CjD>My z8yKpius~3p<|A$YM!b*wd6rxFxBKWyy+jU;XCb3aBgL4>%g!;wl5Vd#KZGAvJ>d-N zNGjQln#uh7&fXv4scAFo2`z|leN`R&i-Zn+DwRM}Rr{3Jmi3Pu?!}fvuhU(7(t~E> zX;L{4^q-I)U|)Mj4sItb`zwo)>#th6yb~``0sdQedKS(Pplz)XA+z!z;Ucx?s`6&O z@NPBx1HNVJG<=H1a|kuGg}d)g0tvT(#iU;`!&zIOYw1le7Z0lQL88rhrAAfE?|q9> z)Wno~u;jtRKxx#>h}($Jsi?nsnF0S6n>mSy-t~(OiGbi2SzbhQN(+L`PC+PdC1j@w zy`e7j(@@S;5m?TZyj51a&Os-EdDPf|cOPcD0I_oXRk>P$z*1Sm5T-hRPE}zA&-3Ib zE-fMmh@@-iURqNU!$Y!&TH}rqXOdw@uSwV+%78|Gr#d@_=ypTQTimV|UD}6pcutYX zjk`h~t3AUS6AxIH4bWI-EIJxKzQ9~E_6<>19=h?Jdr45sS9O}Cv{)Z3Eqm0Q>wUv` z(hri(LO+Wt9*Zkc>*1^9bF9W04o!zGow!m?#oNS6bb2c;l#F4D$p~itVBwx1VjdBF z1X82h9{nb0w%^5MC52l)V)s;pzYavuvOZ&I{w)`yvsawOyoPyfr9rZv42~qrJ=jb`I;q#am`E)sXE0r|KS_KX|3Dj z#FmPn)A=?9hX*?b@?~y-x+~9Oqs>(Og{q9=-%BR9g4AEwY17RPxa5E=Y)E!|a+3nr zd8ZBoHq<#|h)v4^1YZ~QUP9^*S?n#CYYrU0>`Tsj@l9f22K1dVNxBXU&-#7}6}tER zTGrN-i`6s0)y>Z4l-l8~gkXCRG_X`rRk!3#*RoSKNzSwbKL`x6!o0B1OqWeMgUgjLZ~f9CLWuFb2SWEeyY&dZug#HWu^#0hfTk`(5nB? zaDOXz?M0f85Dn$Af4Y|`?N>1xXZh{mMsFnrd7@6RI^z(0)ox zEga?>J3NoYWhZY7ymeLS)K8?)zrgi1M)?4AH01n}UuoZB+8Mivq7-vjOWtzYVUSW} zk(@Gs#Du{hk{dEY0t`EqlQV|{lnhn%@-M6dQv6okm5>MMLD7@)#>R-*y|^*d!Lsx( z6#E#+0$=JSCKq0s%HW@Yj5@7F60!KTQyvtdUlYw;5B8HwIHCU(Q+oWN*lxp7vGiwk z%?Qh-m!tMZruGSAxr8U#)!yGOKI6rwBUB0enIcfh#d9;EJIIN0}Jlt4N_wLR?m)oNFXXk zcS9(fZnrOrOK^Llf+?&eEUG6c3Dy9vV- zXd^RUOAuEOZZ5_*KQz-Gf-kNsxn;iFgOT9_{N z7_FVbn89m;%vG~9THIfzB=k1feOug|%US=Udo}v9u~b7mXS&a9)$dhEF|)lLpmA zGMWP-Hn`NE;qWX-345wWne;!lXoVWyKD)1;Rcf9^{CSv=xD_(!Yt5sh))(E9|hiCP!?*J zDt&9~@gBO-zxdjM?eGXe5uu@=LMSh?APL8d>P2P)(WvgK+&g7fPApDPVIe!FR$&|Q zH^)AAIpzAbV!IaxV( zDFdpX4$nQhJx)k4$l^`h-Qv@Zk7B?fQ#8$W%kN?G%EFIbjI$elz+OVeG?9ndczm74 zqD(8^c_Ar9ldi1$AsclciL{ZXf8S-$AUb6R3yCtc}vvGXE<65t#RLB;t@jq(IwD1aRnaQ|6 zfx73viaR#WB{Z{AkuNOl`v(q4iF4@EXGCAO9ti@gCsoeECv_c|j*3z z^pr}m^PkdmO#JV@7-tQN3{f$vxwm)jsiY1bn1b|9E>=j!z}005^`1Js^>E*vtwPai z=m9p!Uxp&LAFSn_lJD8|Z#--)y^Ww(Fz5P;hl}b9k>RBu;YkG{ZE-Gx)VUAm-Uc>$ zX;&{2^7}U|ZjB(8irl8viZ1 zq5pOk1~K?)50uNQf-sNZctzK7aOd&~CdIL3G0^!=a3P9O#WWu=T|mV zPfDiCx!(FX?jKj?p;A!C(p&#~U*$-iPrg^p@{)4&{+zX-dU?+@70+KA7{31}(~P>r z3|eEZx@*l(Glx}~bIjn7isC`d+;#}0s&f8y(~_eCO!UWxee9(SVV9F{NAk_%_+QbY zOS~{#Q~~5uyMBsB)HFw5$};)?WHow+`_TG^Cg?kptlGGf91c151de8P zXQ{B&M&}}_XyVUZFGb~Qi^!Zlw7mGEI=I~a;jE0U&9mFy=8w)uQ_-?Q&w2BTFT~w> zfJ+(0`Ntonw@>_B>!=~0%!8(q+X;sPI%JuMy3rNxz09+GJyMgfZ4iWu&?lxtn%^u3 zTZ)9^O_3gHZ@DOeOmtUG!1(kO503Q%dWm;qV$YImgPy{Szu?;wB}+;gNjgszkM!OtuuXnL=%K z9t~1K8d`{V76a9gCyu*E39`#%I>eG)TaufIBR&K!z2|x|%Sf;IhAnZ}cIH#BrFtZd zU8lMvP-lz z$?GgpT_1m9PrZlIQR?;RX#%>cKgvneJhkhEN;;u8LwIA~<(@V0T{xauYhCFUp>|tjN zg?qBA*}ogaVW91utD4HM3dF}Uk)2w zJxF!!ER9T=SoN_%Xf_%F{~VR1z;2IQ+b1?9pk;%N9&gGMn}jAja?iS_G{-e@8_*hk zm@R!HJSqBW$mgQvCiyr5pw-rqo`~WF&OVYPN>gjkzqk1NJ4}zWv=HC3xkvXHAFcYu zdBmw~9}28Kd5`a89*cP7w2eZMk`OnUz=_#GFowSkBL6}*d_Y*VpvSsY$DxtaG8Bt8 z$87STRxS#b^SK!9!7-Ee@=ue=44~^ubCd&?-@AXzr(frjyR2#fvM3~Xva$MZerKRF zJOhKqXUtw-7XxzhBq4A7XZ?}COqZd6adxP}- zk}vQY+d{Xa`<6I~hId&UU;;?(53U?AoabAr>Yx+xCKCnk0Q<_fg@PM=gT3@h$!Az# z&?6`si~5(IP0He18zLS#<~J;S-m)^YcHLIhR2`^y@t{m5>qPOusaol&Pp9+qo95LI z<`kbQi$xjX$z{fgK&qOfL#x-ALIR>vHc?M$@&8thFtL1V;qJxWUM5Tqn5eZb4ALK! zg^|KbV7#YFMUzdrY-kA-Eh}fr4ncQXks?Jc>mLP%s0+2?;o4A8>B=mO`=XLwIF%1+ z_#)!#jxta;9--WvuOs)@3y$E9Gh`!Z=2=_=FgO$B%0f0ZFFQG>T#*Jg=NXhV5ZO7tcRgkEI{SI3!XV&6_)Z^%uqkGv?9+lX_%=AnU?7>}o?!p`LKSW5qNkI-4 zAmCGs%I*k*wesfMR?Feci1m~(Q>T4LdjbIoj`3XsfOKCj9P_40_Ly9i;+upKtp&6u1S9AIAHM zR?7k>uWW~Z7!tl#Yc=3d#npNE#;ubGcqH#)_9IYMNYqPzpx3fn4*<`M3BX0D@<`~5 zL#b8d7tmyQODi;!elH7ADu5}=tr9Sn?9E63waIyixnHlVn*RBO4OMHa8Df%?v za&4-e;)#pO?$}xl{c2ECQ*zL5ml!V1-8lTBDtXV92)uh?nFTlt;%_ZZ@?Q8}OXxcn z!k_k1a=^VhqM8toVOw=*i$OVHA{}#-#zDsuS}e2G2q+IwG?sZ7m zIkTK5CV9@3-!Jjayq!}~soc)Dugrt_jjS&N;7($`4JJRPoD&&Lf$4?z=#2F3EoF^` zRE=W%tqlld987o^1zXgU5TTWo@UFm+Gr@V8rC5t(KS$Tp`!^R6gAg5acQSbiytYXl z{7>;Wri&qb*RlE4#Z7xZdW<;u;xcc#6Qs&4W+3YK>Ok*hsAHM7RTE-Wj&N3Fh^NSV ziJ$2wbHB9I*mQMUf6r)edeNod&S31P0R;~%uDhbWs^j#j(NcfsO9D9>xb)EtH1>j6Q49JA1Wyy8EO?v&1#(2}CEtNOOoH5%RPT@KTB4*QpYBgx#xKlt7y zxnA#!%!=3zQn+1+tYbpQL*bz#URN}X95erey6LN`Rw8);8e&6J5k?5bW5>*YRsct( zOt$3@k&oyvCA%lyIW3vsXq91a`JupvKv*Q$J`F?*CmpE@ls(#82jr{dvjPaBZJ zXlg?Io~;*EwDFGy(4EdK!GtdLf;O0@d7;3TF-AlU{ zi#TGy_b6l(sh^3vGP(M#pSQ;xgap(uhh|VxLJ=IVLHnBd_U!$-h`nzX)w&9SQ^T zuufyi<_?w>cuj7UidAl|%tuumw~$<5S3|ON7MMIJp@L+Hy4G}X3>_A5pr1UTUpo7c zk0w6tnwGgT;3ZtRzTqq3kp;TS}v8X?1Z!-M`T&H;$f4Sx%~1R zF%!k}Q(ZxCv?XLw#(WhD#{+1+!r7hINMV|NV3NP6o@b$*s~?}g{(kz~1#kf$ch(vj zPFM(aCalcxG_f-Wm$SByc863+Wzkv_&jrIyQ!->QmADJ@-1 z1DxB8zHb*YwNjgs_BvtLzcsj#0~1+Z%;v(A;Sze=U^EbBlphjB(Oe3_3+d?LFgO~RFlelpwu=e7-knEHj&*9)P9}vFdX+T|?&HNI zRfc3Gx{kiMY11sVouvSiWfxvlQ%KMu{+lYj=T?_IM7K)lXK_OUiQUbD*#P+rACQ7Y z-}=O)PPq5$EW0n%qWU_d`VJlDZW67KBml$=7Pdxj8F7TX4%suP?&mV5vrcZvn^_bg znt$k@0{$rnThtYGG(MPss4uNl+BD)#$JUsJQS_k8h&gUCd7aUBW#kaDq<3)!(m0?1 z{6+&R7$k8d%dtLXF4XT&ugFfZD*~m!ZJnm8vYkgq=9LWr@7uXE#SB}H3I?vU>9flDr z6^o?cNlfoLaGrxS2bmXV!_Y!Tu|5%#6(ob4u?&@*NHDgOX?Zf9k$}4(igrE~xQau& zINlP?wzmH^8*UyWENX!=BO&r05#W6(3XjyB2-eMq@7!g;QDW@g;q zni@5HROANQ_1cZPkLXL0t8YXK-q~(kmpGhf+9!pG)>5tDoSFyb+OpF;%ohNI3p^uB z_ARB3&qE+|J&}O1#}vfda}oa(CJdD(%!|^^M^?*2KKR(FeI-)1ce*4SJVWh5t@yRH z`zT>UhX&0GZYaSc$$1n&eP7%*rKLavxm;GqohUN9yA1lmKBV>>EaMZtUvkGwVaXPW zQ;qTljluGFMh}m<(0rYunp7Q8E71Lou1e-Cq4e%4lZ?I6ox5)v^a7lyfZol?%D7gwJCJX+7i?Mflo~w(l67^p1(}VZDkVDUrS%~63z8J2Vvn%W zqvU&-Nyhgv=xILexd}4|)OHs1kEPc4 zny2=8g?vtedZKsZ2+2=G3yOU;R~33ND~DAtbJR@G=d z0L~Ms$!ymV$iLw&Y1FPr4gH$n{9-z*t{Aamjh=f_zG&A;)d8_Etyue})=xof+KKLTu7+S+>*HYS=GL^KL&qdoME7Efp}A zXVg~^K)#Lj%Lr=*-P2T?-B?c)*EH{KGqu<8ei)-nx~flud#3KfH&ldqalrLy1xLAP ztT~tNU4@Q1lI|lc#W}>XM}~<@q%@;f>&3L^<>M6u|2RC2>|37^i%J7P9N$qI* z(i0igFJMj&ix{UJD*vpYD_y#wwamCWIExcM}-7fMp-%4CUzC@Fpmq|CksSpL@#>SqfO1GS1&fz zl(RjIV<5l(F2f)6zG61$x24(gmwjr;ce|SAA2eHiE^^pe28SA2UxGrw0vhNcPT}iL zC9S8djhBh5;}D=ksk5KYl$~n^l2hr_a81XM_M^WF4(*OmJa%@PtAMc-nziO}0+maYU7huHX&eVyA<4fLRutr%Q`=Ojqv#P1mnW(zYOx@)qZzmJK9S ze=xZXIJxb(?*!P@QvR>xv%mLND>7eL3)F(#1tD|;JZGdIDMO6-L@A3xJ(c(oQD!_# zt&aHWBG!K&Bkxv<3sgXCE3{X-F_Q`qm=H~@uCVplqx@3|;qkkBuhN?xf!dR@Gu?>f zW!T-(X5ooAtC79@;ophd%g+qC*4U%|@3Rjz81nEBNqG-YOKSZ+Tov={HJ_@!v-|{UiZ3dx$x7W~&>{Nc*(zGCNt!7H%&&hU7@-eW z`2Pd39SjZ0+Et7X_8mgeHyYzEj4`rsD~A!`gwQ9Ro}!q-K? ztFou`Vfc3_*i?H;0V(~uV7+GH3NP*5xb4r28Y;&A>I107sIR#fkz2uBywtb@QLI`; z=o$J29mJh-4Xs(^tw2sPlrzb0Pckt*1=M-FeH})O5umvev7H0d&jtZpgd`|KHa>}Y zA2zl9L@`(n#h-1)8>8mqVBH_wxWad`ayd*AP(Ap##eM9U4p`#s$X_?jh#b&;X*Jrg zb#>!|WoS*l5fJg<)q0qAMPde2C9!E%cZ=-Mr7D6jR*1v5w(2}WXwNDT?s=|7F3nEyC8RxAh}YaB#AGu%zn z{0I4v4#oq~f`D$Q&cc4M@~*U~^Hy1ogm;EZcw2P{W@aFkhH6mXs9*%d5BuI40rEv=}a2y@jTC>M7vfQY1ORW&OeA@XodBXq39bTGWA_#R)9R3o^Y= z`If8-EIw1YgoAIhq=YQS)yr5LM>X;&7;4Nx99ubd#`a%p?n;J88ICr1h_&HGK9+6q zxgT-VOIZC=ERs4V#l3ESu*9US9JC1gpC1+z#u1pNF+ z9sRYMOOJqP=p_VV2w%1X+n*>@{Zf53AqE_f(eNa&q7r(&@;ZnRsUy7OuYPNdzdW;R zc$=2`{QdZ71VCH`j(CDn*?(x&xdbi z`3>BE(Re3V28~~8w|9CY+*qx2Y{1Xi$Hn~P3OH}LzC_QnDdD1%L6BC^* zrMM|&pgjLlNmU$;wi~N}-&(hJq(zMHuuXm!%=TJ&P?Jc8vqk9wUL`(#N2;+*IXS1o z6l{Shr1g|i3vd@&(id3>rk9M_;zi;}k3k$xCVaA9+GvD(9_f~FTG-}mSAJ(kR;0>2 za2TCSL$xRX{$xY8MxwvBUQu(FjG^EJbwGC*oa#$jDHKj7LDrDRd&+`I6wjvZGSD#g z&R_h}Sj69o@K@!7KaH0DM5@@H=_<&9{HPT15}rg_54(7sp#6EBEGKttnTi+=SHh9j56YV zoEM@;SOxcrIU3Y@dt23GnG)~>%XI>hn>us0VLYCtt!74jfsWU!BjI2Xd~TE(E-s4BjcEh zs20)$t>O8rF1=9%T#;YvB5Q}26tP+Ls16b)sUJ`aZbAdUvIwqKE?*H9ab-}>!`iy? zhf|yy4Gf|p4Tza{xZ5I^;=&R0GJ~2P(JW=*n`bb>67=VYiM(Y{s+@ok2 zWA-NQ+kamZ>K(b6d@ee(*C{%0`eI=0BH4QRR}`!7vYSiqT*>ov!_Y_G`PQ`jNwpk{ z!a(`Ca4VP{oK8B}Au~9R68%{RLB7dJ6v1^`sjAg`cL!<>$N-cgc?vK6^ zpj~&T(_Zfz2X|TUR#QPC0CQiH?zRRC>%hYD$NWp~_>+zYMPrTpr+xQK;Zng5bVZ~> zrI)TDQ`8Rj!V+!#k)B0=Q^y@>{UKrK-cye7(^N`izOSnF3mRo9yye7N9yJsn%c>s0 zgb^FdqGIcKjdkRCVv2GLFqsEw!eUlTrX#$1d+=9cqQ{J%GcJ(ANwto=LA2k5MZv6c zg01MqLF4wl7WECgKxF+1x_(kI1sWfM7(rd6d6cx*dCui)`9Lx(UfX@f->gbBLh-*g zwg>4+3;9-B4kN2Q5h5x!>34tOQ)cG}TqfeP^3WX0*+q2pzNeCd!cxLHu=R|dXQY^FD1p?=av04F61{>Bu|FrY$^RDw!@P4x^S_N)i}(XTe(p)xXMLk?V^b6QnJs{ll4BVS z5#2KbR^_eW&|5}}D`j_d)0*BYs)i7g&Z0(HcoVsz=HqiNB@uBfg)&k%mb;PUCjL&6 zCl=ZXd)+K%NZ2;-z-P6GI}P9TAA;p@U+2v|CO=L-FXe%2JwEV_{1|0_{d0SHl9utm zhZ@1LU|iJXv-^XC>e4jZB1-j&W68h%K@p%J;WmZ&h$66K#|D&lFhj+sqxuWVtM3aF z@k053pn9e8KodqUb0Bx4R4QlOdER+Jd><8LUAjz6Sc#gWku)?q-V?MYS-&^^R5GDg zQ{~e1MProtDpZ77_h^2mBJ09IBmr$;jV4uE*TEHVUu>urrT2kC*^MRn5)`@(E)Yc3 z(t0;_^|3nmU9Z=#d5|0;lyTZydtQL|c4Y`Qc2>u`w%N$CNE~i!Jk5;B`#V7>g8|i| z>(O%ca7&(jFPbA)@-S#5J{B9NK9kDv4|FCO4+cc0D4BHLU0kU!3@8}N5O!O|^hy?~ z7zd|~00;VCm10RYgWZ%5F@54`gIlpxQ_TMA@Nhq8K_efT$awn6jOdiX5P}vTdpWj? ziAuThy;S+7q)Co-83B$_9;f4hS*ePIF14=a)H4%Y12LCk2MI)OFdI$5zP zc-B-A3LOS&!xexUw#yDtynXtAB0h~75&Nq$7sJjj)1=p!q#nmgAu7=x|17avm^uow zYfy^G!7{32a<(6r#1w|il*gtFCJuB}uO=>5NzW@Qi5rEh2Nxf$n`CQqqkhsOgN33u zrNGr&6I?7u9C9PADA|hzueX11t;8*aM)^SwXb=><0=Mx=W5c@0b@H#zzWxgR&^{;z zLpBk?QOj_tohhSAx-J)3C|R>>+ThqUnqhU=qq67m@rENOtg#{o zq)le(vj1aHP}d2$!|vPtv$qOOi-*FxqKfj-cZba@Z=o%et%+Ic&1!WbG#egA(ZBER zs?w|Jcw@ZmZ#nc?iIWLeKx@ZSFHQICEV7b90y^K`Egjm&8@tFPYLS$hPS+XD45zP8 z9_SNY)z_$MF|&0j*FU6m^tzTN1GOMrS<&cyj`g!^kUHX;nrAnM!rd)(#DJ$itUBKI znJ#QE=e=jQ_}V8zC%$$yz1X)}5xT+ctKWH9ONBv)*8cpJ2|$!nkJeiH(zt3>0N+AF zw0Z7dto`Mt(_cb@Qa`OYjwW zQ%-#V@gwWsS6hqtp}zP!1A9EG;PwNN4F!40{>He%?a*Z5^RCD~SUhj1EaTP7A?0!o zIsw*Lwour6)}H((EciYFO^h@AKrkl*zrMyGCdRbK5bc3Zp&Rs$zFVR%>k)->DQeh4 z&NULWxRz+y@MU8rA=LvKmk}B5>Xjf;i+=WxO6v5U2*2PwG(MuJC>c+jwtN{b{6TI{ zo7s`SZ*O4MAMRyRs z$}?F#vT{iD44N=RPB6B1+`aQrdFbik7lg zVL)JmRI4H)^3s)b7_RP_P}SH{s*aEX?r*l9#aKZI6X;Kq%0?1XoNrbKx#tx_lvaCP zLemU4KgZf($M&*nEeiNP+nYY&O;?`{vW%%x5~=*UdWTaB9gRIPPQxT8F8-o~(DKjk zM;7?!2HdhW2?I7mUAThSce6_e3Sdhwb;cgr9<&4Y{-J;W5$v`ttsSuqxK+HjrOwFh zqh&)XQqc^(!e|4R(+w?ltc!YFAq_qES8vCe_mKFrp3(^?hHfhLWe_P;{~8qcu|0;g>rxwbS@ew;*Tz8JE;VD=A~SWh zU8ckC2a+e1y`w6<{B4S$&ogsMwr4iFu^1@?MrU?S3RPyG6eLdy>ANoPQc#fyS?`dK zMNO%=S8{U{7_=biIc46O)YmmiNVj5eAt^)|i8^%Ib|GM}rQ=$*nA~5?;bdy=`o(L+ zx(vjWsJQzxfoJr;c=2c|_I{&Tx1;!B~9V3A31GY$bAmAaFI35ytFW zFZaOP^!2V3`j#FICXcbi}{kC7NAg6J~)3Y?> zyvbMp7m=8R&gX8r84gMBu@GK(pVYPk1p1i?HTEj})D5J|WdxA%icG9NDY0i8GM6;Z z?h701eDxTW^CnXT2g1B*+5a83OE29R7r$KyeuSNxp&S1R>7$#ylJKQbj&r#wMN>Mc z4F@9D7S2HUb`wb=Q%%W6e!)Bl*e@~wOU~ljMy1v7V9=Kg>s`fdg6??)B&10h+u%Ki z5Cl~U*aYHL_;Lil8d09`9^z@TWv5n&;z)(_InXg(r{xY(SYn?O|8m@pkfGt9 zBCD3%;%Z?*!LW8KNCHh*%iV~rd*}D>O6r$ zCOs5H+b%Ro9*J=R`raN1Mo}apF7+2n^=4L%BJLI3?|5J$Jv?*8qRrs_6Y%=0-FK@E z`k-hVoz$+ddDHU=8xHjx*n5Naxx-DQ2KDO!(+}mWMolu-7_*^vsw2u~Yq}k_BgP&O zNAcN@(fa-C^)JDUG1l@4F9nB0LIA@{l+fiBYVPBQ9}s{{JOju+l*&-^uY`Ma$GS;U zSz9p$M3Ii{CtVjbLhmK0Pt=j4CWt+4JM^`oM3Xc;{tUWkfywD1WXNfSA9`M#OBQlk z(+ZCkoPLu?yibXrPjyuD!-swVQyQ`|5#Zflec=G2ZRu$1kTt>b1@d7UP)lUQLyni?9%uC`t~3Xg}Prmk8ZC*i~<5V ziPu(9>+-uesbp zp8b|#)$i5#Z8&~di$mPQt(%nPK7XOo&t-N=O=j9%K{*;53eqj;R0p#PVZ6YoxrE)C z0Tz#PG;?+LqZls(a@_DxR1rkT6VS{fCG*sA{ideVeh<8?w2u-$Si}8Z9)WQbz}(2H zBFw`}%nX>lOD>Nl^uj2TEO3%eVl|paYoZ~T?#{u5N%wjg&uZ?*iG`2N&f>r1ChJjt zOFSXHeh3(-HWjM03H4N|fqLxQhu28RQAVU`HvRUb-oJI(%b=2dQ+|I##xwxQ2!G-Q z)FwP}f#^A26%f=DhqqpN1Lxz(oDmPu@?)N|$6KnSc7-6yhNNE0;x- z6Bcn8EOTnnZ-|CWr+HAgGkue<0fA&CO{?`m3)q)hFBQdL z)emXiQg`s-491vhF`N>ejixo!2;_vY#VX(F;+54Ct1 zM5-Yiz7ECXVwkbwf@E?BJa4L`64v;+Leq_rg{$oT!O7UMB)xg^6|o$Vr_zKWeQoiq zi)i@Zk=tP6q4fVQ7iD^~n5b5W;I&X%bNw1#RNO;=0jCE{&)4y%AUpV(=qaK_p3{o0 ztOnz+H4yPCW4XX{FAIouCJ{$hcJBPo{}(zMeJyWuNYb3u+_T>aa?yLlOLg5aSmIXG zKErQ?q=mS3I+G@>{>K$xb>!fvK?=3kr7{es=WRmtuP4qsg2v+b!NV$#3fC8H8O*Y{ zvILiP$60^^Mt1}~a-^3lxGi{w0E-dx@2zPu2?>$t!m}Q0SO!w9h5)9ExKEWhl|p4F;+3#-3Y$d5u%t@w)#>C2V0bqQxBCaX?wD6TYh(|giItyQ^jxOO`|&S zq_nZ|NTJ|exH1?14a$$U@;5akYX-O(O3m#~V%>GQgf)|orr>oDPKT*)DL?KWIT2q# zC42&f{n#)ZItk%pJ=N%9EDt3ZKsyYNCjrxmxK>_s`664kNj0ga2c-RgUoXU+?wn8Q z`w^Q(_qBViE|0=JKj@4Q4H_Y+u+6$dgdY((#dY5uO6TXVT3tSU5Z^Nw1rFtmMDnTh zGBGj zaf}K%)sdNQ^)KLs$6>~n&W5hGd%7p?F`8@?66S;@4A74E+Lidj1r7Jm0zT1#PLjZM z5XX@KyX0k4MI9jbiLh-QW%Uzj%U-;GdX9EX^C1E?ukEXGL*UR)nIWT=h)a~Fhb zcpip@SI{KE12mF0Vj7g?3zUa9Voy(POO90Tc|7!_t);hdWY60v5l+e5&Z3kMu!b$` z)wgoa&kAvZ9>W$mr}dtt`93E2=}k@UD5?3zSOZyXEkQtY=hY{f1Qf{56SmsKQ1Nrr zlTlNH*g0gvP%H{twlezo8ga(mc<;@iZ{7xDI1|U zKkggX3i(L$5#{`QiwMo5asv8MRBZL52hfwqIO68ysaW|=Tm1CQhh*&4nsga6ey?0i zaY)=(Xi-krdeYxFC!fpicgiR&ecdo3_cjci=phlIXsxt(oR_(m#h0Ds4HI;R`RF-B zvfmo<$Zzi!!!+yCJJ>QO3sPSb9PhMEnJWn1s0azS*h8XBpjOOew68-`)~66a&Ojx3 z$D{&I!NbaMU6uowU&+7?kYkEBUS{rre!ICyzb;ya6sWN|=H#3|zbl<%Ob2AGcQ>bA zl=MpiZm~Y6#ty~NksEl6-OQpPBV$Pf4dts9S0CiGaCO#BjZQZZ?pLsd0N?d&eH+XMl0Zju`+0EK6O`qmy1>*Pkz-0%T1j#X=27xir6aO&?kxx9d}R^o+07l8 zIS6b0djtE$P;=>i|29gipV#&_K{ZSuGI46QwK8%uX7~z;eTKpIQ&*Bb@I@@6F3@!i zZ53r>WHO!vK`lG96lq!7ci+t3N-FP!QD}1ZNSxAY#;!4z@u*NmyE_QN>$D0*#a|8z zX%3zTW*z}a@S}m2Z&XxJaQDfNxNe>91b6 z*6~3&hpL6eV2)4PQRpfG)PPTUpxNBLyheaH^a><=r`;U*=5Q#LETEWJ6=Kc^AE_u) z%TasMCu{ts1PxG$RmI6w9lW*nNe6blmMkHp=va8h{ZagSoPeRpFqoJc%M^+g$yrG_ zT!0c=ZY}Og=)IY3e`&C}Xs21un}%;DZmZ+36+sGEEB6De)%l!>rq9~#s4cc5Is0e$ zxGS$E;YOTkd0at`CTH|LU!6ZPpcb*t-{fv9iB}=4X9nnA`S0W8i^rtYy>NQpXqXmQ z-KE?14a_Y}U@waI3yI61=#t%@QXX7z&htHnWE%JMa=*aCXJ&x=WZ#Bb6RNei z4^EH?=BoGPt6UZj`mJTQ>R{lU@|7u4o?^>*@)*3{5ZOOTlW?9Qd_?T=ElvdDfG zll8oY;C8ppYobmXmbr%yf=^p~mu7@=7^04eBu7K-T|9*ATL3q*RD>3!m!p%DcXg|< zfB2e`N-nkN-KiFMV7iysbdT`+*y}6U>}a+yFMeqmBD)c6AAK93F(dU{UwEuz-Dm!% z-yd`N6z2h!^wyCxUR;lAUq$&7Z$O@`czW|oNTK$6SSeraP-F-HK^*-Vs!p-Gs`7H< z<|lS8tZ6nOQ>X&DIzfDn>a8SXl$`g;yjW|HQjfzrP?z1R7CHEvRz{AWY|!>?WhqBm zGBX>BcS9ZJj*4agL$+iSVz|5oy~3@I@FAM5v{ix;0#(SMSKI@lvMWRXbULC|kXc42 z?~q~}cHOB-FfL?F2Y^Mxa8knL*WSV zvv|MpCDaZ)ppne)Z>xyQ_!Pdaa}|gL`$B)o+X2e;T&&{-VRQ|p>U1hphRekpC(toE;9JD(W9;}8v4-A5Xf{(qml zW7p#kY1?I09jy=4PiT_iA42h865`U?W;uZG16g5`=DEo}MCCc}_k~ar^-yNVl4km* z8Inm-B?uKpey(f_*M!R&xR>K zvL96JkNvdvI_JJ*0Fip zY2I)>p#ihh@s`*WEagE@q1u(L`Lp@?uz0sT*f-?zFmp1@uz~Sx$}yWpLGd+lo{E5+ zy^}bUL+MW-RY9fe$-GKoj=$kSG%F>Ru6B2GP_nHf>x2Jg%njn#XJ$G*HrCYib&o5` zaXR#ren5s8PvoB4w`grgk(#6}-$(p{Q#HcFv0wWtM)Mmj3kjN#Eq5Mu?$0^hV)zW3 z*Biz|n?LA-wGLu}cl>XcM4+FsE)%>Ji+jwN5aK#AEBHb0HNJ(bpoPC;C`HxVzfOvX77BpY|8CswD|ftWpI%KQTP{)2p|W)1OnEEdNQ12h zcUC12LBUi=vF}AQ<(qwWeJ3>u2l8t!qx+xcJ9x5Ua=pJ=sP2R4SmTy;D_IN0sy}N6 z&R{jBBW(OWV~K^*2GQDCX9H-pn@l`D-BRQdwO{wUtLV+CLU2o5j``gP?*B6bs@?in zb;72Z%x3cz78x`jw}>+_aeNi+uKi5Ypt$;Uz|=pQ?}Q?`{~{|DRt(k=ju%tIIPxPE z2h9GGn%ZmGdD za-5c&O{6Y^F;Y{%A;4g=lCFSCV7a{|^G)gM;V00(nxxT55wZtB+fg~ET#J(w0pSu4SIH7ijwAo96sr>Hq3d~tu8{#oyf2`5z^n%d^gPd{x zqalw|!;1_YWVbs)2(UKD!s#m1zPiYn#i@;x7Jo5^Sm1+0%@wt*5Wq-p( zgXLZ!n&$so&VzDuAK;>LCG>83y70)vT@B#5IRAbYMUwT&NtawqsC14TSn0LH5? zH(TQd`A<_MqqDV{XWdfQ#HVgxU(wG43pJh#AEF@VWDk)Mylkee0y!k%oO?e1K@ep* zaCg~2Z=CP|``aBa(=gic3$N2x%p_h|=+~vJVY@KkRwgr6eLwV1MI`uhZZ{1_j*c09 zqsabIUhTm1xa`9Xik|7A-hmp_w@dUBjxn_ax zV`o0@%i$7{pdku}bFY8MY6>fpiO5aPy2NZo+;lViME3Irq zgd#v4uKH^JB8u&)nNV6TESjC8_f-w}%fXJeiLM@DJiYvD;~#j3C}IxMk)V>^-@)+x zc|q{~a=_uh^0ZJGDq^8`*Pg}kM_dP-!|el-hLa2aw3-2P!R`3R-HD$k2xhT)bGD$} zJ($^kvHF4c8GDo7PO(JAD!Txuuk4hh1vT5*atZa>iMRn;r&CkVK zxMbZHUPWfM4A2x+=y$7$LI@Qf-!jDY2usp(}@+0rP z(1pf^IA4PJO-VvR%TM4RbbgC6stQ=C6>0@`nnusq@sKi61bNjXR=gejDC#n)rdF$J zWx=_qJ}x@r8xdHB0?3NDwdUU|(`$%_=LxVV@N$8#dXwz>9vXYNfV`2^>xSa)3enQjk= zbs>J&OP*);aXb4;A5w5A+ix1*@KQjpF4NkjGj4G9)HFxp5Zv&xRmCPKQjY+FxLR`| zJkq*H05Cw$zaY;kP>Ht~78tGrk#!8pW^(gs*P^?y?LxIKyK~zA9ZQ4HRGh4%qV?#K zNzgInj`85$P%VR&+%PpV#w6+DcmWMH$Q(} z(4|U6kC0UDpehTa$Jsro2s3ObMS{5S$xO|jRHR%xKjyz}#2wiULiV%~Ha86dnUFkH z4K+B2nI}#AhU!{)Pf7cRRV*v>Qcj%yozoWFZHj#^48UwL3Zz5EU|?zDgBb8APd08q zH3nHc zqKB2>IbKY_8l2i|;zZV#;Lan53D^gv=OOQtxzhtz2<^*@tnWa_66PQ!}dAxvPTO!$W`l){mI>?pyaFY6GoE*5$Ctt~Vt>{CdI?_e5 zq4PzE>Kc{w;UosdM2gg}H#876)Op*pM*M@82{2_5>sm)z8R!NRu?~TvNl&SE*NBS$ zFG%b~48x|;4x8*VnGB1Yz%Jn$J1N7d5uZT`pQH0pKD)0utz!;2r+>q zJNrqxg{E{@FRmQA6@!DOxZ(uSX^d^K1g(V@4p=d__<0497wK0)lLTD?_){n7v63Z( z$zmnXhF!{LmUj*Z8+mN7#|B3k!N69XrrpIaIvRuIP7U?F+b^N;$N|84;(6bZGg-O~ zSR{}yZm7QAa<9#+aa+Vma(cXirsP(lle|uV!hGZPGpza;abq0p9O-;?za^iRD@Yrd za}v&*Rw>bb2{J^yKz9!Yqrw&M<6_0c3iVRWH{X>uCuf8~J**7O<_0rEW)if>h+mwAvKk}=w*hu<>@Xgjm(2W2ZJ>VN>P-J3@S z?;9(fnDDansR{(fLu_0a_HG^b_vDb$x;O#n;BL-(?&QS*P1MuE&t0>}N_5}z!T#Z? z63n>XNBlV^TkEc6b(N9e8ucUg3jB88`0h*5s9JNmt~54Fdn51CSkk#BMwe8k5#nU> z`_M&p>Sb(6vvGiefph=m@0c#&E9ws-FNmt>=W;xSq`kPu~+F{9Ibr$!gN+4 zxe+7T^`eq*En&|Cut;BfY)d^B*u*b^60Y{uBwkFRYID7%(Yj&G|2`1l@GLE8-wWVScxgu%fGkxVaJvRK6@o{8K7fg5OjIK~Nnhvp@+B7it}5un5p2&`CRV9=K)g5D7$d#W$Xpn4f;i@vx1RuERdE zC7wK3jWEK@20qH<#r`Uao=FXq9yN1s=D*7WteD0kc`>cOH~Lyexz}Z}7OZVye zj%o-?=LO-7uUxNXy(0Rzf&hJCo6gwVW@wQsS8xq9S5t^;;4&C(EmWif_{*n?uvf8S zTqYTbF-O_x#&#wS0h?*6KP<>U&h3TnQr^S_>ISP_Y(GtqlCvOW*DNqO=7TY%gz(P$ zkO4fK4Y5_X;*f_i?+D~75`xyO{*q^|X?o;chWwoy^d3Rr`j>BKks8GYHfQ=#yEgVT zCWkW9f#sXCD@c9EM!IflbPqr)^Mf`5KjzTIYArr~uS2c%azaphC7?*F#@GL?D2>!(eb;zQ|&PtjadmXb)hK5$<4MUdR}8A zd7~Htm^`?v+)3e(5_fFZTb&sN)rMQl_1(+SIDqy4Z&vCO$X879J+<_n$WP(inS}4` zVo}u898xo+tR7t)fqXspHW`D<>X6ns*3@7D5hx}&Tjng=HRlw<=9^o5g;Va*3vJY1E zMm@-JWHul(CJGsh;^v&_l4j-zz&$uQ!6EK-`Sb4WG|*?(&LAomlJ4>PY$vQV{PVsHg1N_Z3f7g}ec9?z;F$vMoF{UU`g=nQ zLK1l(k1YFY^h|X9O=ZurFN9as+f^LQqJN!%UwmQb7iI(!QxM9!FsnJ4F+3m7cY5mL z2%jNzaNOlG1*Z8qI)baQirKA48|rudkl7*hJA;10n!?JhXTA|I8Q}~o?n{OaOGb?k z6~q&;mAkTVliZzO1?c>;eWdfs7`_7~Mq)MPe~L?lgG}Ud>VDXX^4v_T;hKWLsL?9&Xbor{6FRA3EB0oA^@RZs8U z_ls7t)gyH+IiCtGIdj&qGu!Xc;H#;55i6L%dd`k>sx%yL>V!>OR3WNop)i={VLel z0GY_Lk(Tl|P+D%RSTxJ}`xF4o*al?@H!Q%vLy!CLI_n^OnVjsE8vQN;WBeV@gQO5q zvh!2ymw=bv)Sir1BOK&EUDi(t-=9Fap-ukjTY{RpuiI^E-^pki0k15HLTq{osQj+R zCEyMnn!*7khTYSF=*zvT*L}}KA3evw9P!vK6F0v!Q^=5a(TdIS{#qb6%+q`=WJEm% zX6gh|d$(&NyN9uIW=pfLeGjrEP4NYZi3v`&Q)SxOjv#I zw^-i20aryoTo|a|%hhd*jHo=8@E5}XOu8Po3Q61HZEu!ou9dUBOKvZUWe~Qb)p_Bs z3cpD@uFxKh1d1ShX`U$%VKn2rzV>%M3y`qp=faafhe!6+$$wYBZDEzf?ADYX_pTJu z353q^jvk&0De^Nlokp`(DD~(z7q(okt0Er9akHEg`M>Pm{q^;ZS(8X?5%7aqyxRL0}44NwBR9OW>f9v7(r+eRbBQ~#@}CUt$aKw15qO6PWY)R z2j<7kN$j0VV}nKTXxCe_<=nSuH*E&;`_d=rS}FcW3~=SvL|}N>LcS=kf z_k&3ZPvA|AtnKo<@{ZD()zgny71C7s@J;>EfYM9K@>?}yn;l+SP}-pR8cSK*;Gkn- zwurkU3Wp6_NnAX3Z;M?aR@v>)TbZJGgJzp7!G_}N=~IEYP9Kt=W$|uEuN0+XHx6oh}n~f6)8- ze^3|c{XH3c|0(73{jGmj(#`sRPgXCJ=xzD_tRJ85!}QsJ4t!a!A3{o0lo?3j?&!6(<7buzH927JC`#CQ>cNYhEQ6yYj zuurg7`4QdvhFs%CXrR65vy}-8#1%lN;{e##_J;XYWkI8YVf|p9;dVu5Eg>BwrNIrx z#Jz)9ulpB7p*?1!L>}>qt#SN466(?R4Ta$8|4qPJaI-RM#aZXnsD#V+NX>wAlKGuk zlRep7v1Kq}^&MHqxcFV~mJ)nKwj{_~7azsb!?sXUNh?c&xYPhzQ&X=U00VZM_2pV3 zD#j6BAVA!s*Y|{NWHQdBe)YnvCG@n{VTSOZbJQo_Hqb3O*;}K2sVW*?RD~AEw+Knc zks^es-_rCGU}DNIAR7w$2%u6hTTTumAvj;e)sohOP=W!*2u#Uxt87u}-A{}<@Up<{ zJaj@e@YwN#%dtSbO_Nyx;=J%?S>F*K95?#Dp^M#r2P!SLAEMLa}y6wc>Ix5x?$NNrg<_qi& z3Ts5T`SuxI$cAr|4UUB zfXgju;`HOu%p^uYMi7-SxL;Tjv|c@b5%x27xVzjmoToXl#=Ze(qWWHL>HdSN= zNlw$WxhZw2y+doRTs|;=gstMW1Sf>_=QhKc7a>1NqM7)%KE2xTh&1bKQ}C6;H+9IT zdm;KfPMzG7UwTvch&LU~F;DK&j-lFo;1M`2J@6Gf`KH7}`d2L58*jwEbV#MD7iC*G zBwDRK@NI3)SH*>WZ{|f!C<7ETaje?7ZMn4E1ipBtl9-OvRoS-y5Gabt?u}9j?WK0j zRyb(6ZVo0Ih!7$m@+TE_bAgc~=7BD81LZ@;Y?_8(#z+o6dj%>lS%|qkKLbLc6;~z@ zAJ&LQEd0#-MM`cIkD#0_duC`G-U^RI@2V|7l# zqD#f79CJCdpY-q4^%NBg8WP5X?Ex(yVi>8o%)mezNGF z`b;+QarX>vu2+})=@FM&M96C`Z>@+vA9oS2y)V=5oVW$ON8G~V({Qp_#W5nJ%h5E= ziBhu+i>8+3l$0q=G)*Q?Y7;c(9QNzeIb{(U@ZLGl4Y@XJ&qXaid$V!=EU29$$&&B- zV;SxrkOuEr3aL3MH?%{>Bn)#tScB#FK=n^1Otqz&Sn}qR9s%^=*7dDA_}-lAr;62+ z<;;Vdm_wcz)#3@e^qx$5J*q&;gitAs0OA_WsA<6Y+sFO$E0;e1Q?z|4ECjI}8RBIDVCJCcwQuJb+Bsko3|!ranM;dPU-!#G3dKe8ANM| zp_vwPScVTur-mCb|8c+SO#3ce-A4QKXYlzJF(X!;2Bb$8aKAp3Ad^c zw0x0XMM*s}5lY?W!d+xoca-&5~)M&C-npr?ocLy3RgvM^Q23idJ!3*0p2>0v&?uwdzbOaFjpY zCR#rV4}Ehqu%eT$hzTCRTp&%sI+f*A@(pqCmht4Fk(emn0pleWL3zU&Y2l0(p8rCN z8|ZSiB*`Nzc-(qG(L3{91^w4#%UhhPa((6HF(wn*yq^KNCUZcRb>>KQ+_TxO73GjD zq(^8U8;DA>T)XRMlH|C7I?D126;Cx5XW)CGJEidjyCjTi^uPZBj{ZhwQ0TWoX=VD& zG;>1$r6#0*Fhe%ISGdYmzlNP!Bt4hmm-Zx-Q-k!CC+{4WLTEgPUDT78l_u=~zg$5P zIPjR7t@z8e+s4UlTH!tB$M0a1F|-ArIRdzgw&?8f@u`FSdv04ViI|d?blaCDVDG(j zJq<)e*A<&s-pUvBQ!hlFX6_7T?#*WQPrOUYxxN615rM{0@3a&PH|iuV(J#=kMBQip z_1gh0HT~K3=puiFP$7-P-)}?3mkYWa^L!|#0vUUfpIZkXIFp?al%1a%@!y4&KY;<- zMLc_Ue(ta!pR)pT-KZp9eF(qB(a*zEp4j%evy=m}Wd`}<*cBr_&O^MN*Y?B*moKds z84Yb&HLO@OWK4S+yL+x2*c(DV6B1B946-ky8K5r?yD#a7y9rpD3ry;b(OQkRqeV7O z8lyCunsW`V#ypy&5;LPq!IR>~zb>e0+PlwCwVuja@3VQNnDQ*MU*jMBNo^^ob@kku zi%|nMF_=)3wJ@(|fwNI?IZ4lEJv+7@b!b}n_D@%4ZF{KfNi(?_WD-I#r3AY-E8wxT z`t~@6Z%7;CbfQ|%W8bcP>Cx(nEDrL`Vd1e8M^Nkb7$Z$(K_nUI?lUF|_yOv+!&ksd zm2)A=%w@IGc=a4gjgFDV1XGW*)yOXXfb@h;(-`Jz?ABr{gD;ajc!D8bx&{_HKfH03 zI5Vz>(QCD58M4FCNi%`{!fYJvZ^GnZ2b#sSfMo`-!W!i~-I@Bh6e|1$Xw$pK^hqF% zi1Rh~vXaoO{cLf+N99tfv`+4?SCR)}h!Dot;C))cW?f z<}W@uvUX89-zJA|cT%V1a7{Z%etURF`eghA2eSmQW%2692}?czHn_xxL(Zq65(jI* z8iIP@opqOq=+cPr%zvrduR_PWAN363J>kg}8dlnRS`jpSl1@t>j4)poZje?NSHEe9 z+3?(Zbr-|v+;?!2S(juY4{Hfw3aAFYlc%5%91M2x3eRUc5s z%eqBB&7Cz_h!1apXSjqP)%NpAi<~b+ZuqaaT5kZ2i<2_jHQ329W-(OX5T_oZ741xi z?tcJGm$!e(ySrW*|0M#kAuI8LLI$`h=EDdcSoS~0Klul*C|jKjV&o|R<)wJtuI1^l ztaAZ0dt^Mg(KYP$#)9uRa2lpH6^APo&r@Juef#@wU_?iCg@8itTnrGdO-ul5IDNlF z(lM>%rh&zahR;!De}A5-6q{0JzAx^?uZtVWJn#Zv<7EGY^b{uJ zGD{V*`?+x!*lc|E&#A~Til22l|brF8>eo?~496FBhtLj^K)MFg*iN%0*ixNVGjW9!)1Kt=( z)1**@BV|`w6ntF(SrqZ`!L*d9#(QFU^vqnHzZ8H@`GR=z)FE}kl-m|CTJGG4QPs4M zXG#4fnO@FBsYlg|%yK?eEq;s?VM9u3JF#iW)MPGM>mp;SfnlOyMwvInb@pidWIg8>lI>UUI$ic{#FRWxS6OWjd*O1B5PuP-4YW=Je41#C z{w((Zo@OUsUr&{co6oY{YEy7-!8cp9-hg>S-A954_Ftz3e-0T)9`*-$GNID>4@xo- zk6EnSu7)F?u!mWKgO;qs(Ts$0~h&ahDsRe4g3{c}Gja=6+=_#&t zUwqv_D90xLO~N{oD!hkHN^8)DcixJo1Gaq;)03gWOKSk<5g7BB9SJ9uXvHfm%Z zAl=?}S;3FqH3r27#%4DNTsaXGqw5v}s#fqv=F%LRHALX5jNh!^$r4*xZrl4CNh1TB zJP$dH{{`*mEX&XxO_#=zv)Ghs0t9alFuU{B7V7h%M1=zNr9Lh-b?0Y64vFgG1RJGE z(Iy>}TgXoE$czaIk0;`pm(z=l>GIo9ZrCEXwf6Fo9?2xQ?UaH+^IuVnvR|N@9nP3l zht&RC!##Y<87w6(-KgoKJEtW8=*{)Y7s+`KZI&b?w7qd5f*v^?XQF}Iwj!Q+okS?$3_aC#jw@;wi zeuZ&Y=`~0PA-kT}N?{GQc|=Y+zzF_vD3^kU;weZm?1_YtQi*|kb1RyRz&pyfUQ~Uh z^TW!b5Dt*^7c!Zc%uvOGVkmdv^e!C#P-i`R$!n=$u`-mWlJ=JrgQz6wQTs(YI=vF5 z@i;8VH8GPuu?J|UP4Y<~l8BGc8S+dH*7l}yKdbn#6KrdC5>v^NI3-HG?*^3=K`D9; z`39SeDeI$FLg(A$>vDeX)T}bS8`yo79wtDI5s9Cup7U=An`3(StGk~r*S{R|{Cf!u zPch)<>)0}NKis;pQzVc5CyTv*c!4whEpFrRZ}UT>Rzsk{!NX^mwC*CHc!`MJbJ52D zRLVpxYCb3gfosy6A23uvSUK3-W~>U<>N1YsDn)|-D_f3d5{NE(D`~thuTnP|3+2k$}<|ga%jO74tU$M31aPX1uZxY>f^)3x*8B>wKSeZ(u_=98U1x=Z~UG zb4aj%7?1C%JL%ESt;!X>+WT8e)>dOxkvy2kM@X^bm5oFvwLAg|bw6MTo$U{RL@Y#5 zyRqOb%g1&IjdIZ+Ci>uAXFNehpl(Dmqej4vD2@Oz3Mq{&GH)sp#E=3bba36czaf>b z){OQY)z^^@RB=SHXcRCt?lQLWA{RSZ?XnaXIbA^WN(lWxv-y?)k{=UZkvZ$$G=z^K z|7ILEV`U)R?<}4&jm#rIJVYgQNH17Gt8YneU95~D3xC^ASi#09(3O69Lvu)ZHqz47 z6R;%BP{fbI(Hn%{^j^x1qIt9rCpWwR)-&K~A#b{ekDYvNJ>Jym=zBwNXTie6+=^xX z{Ys2A%up*pT?3@-J9^rWP$F&WVY&Fpx5W;4aoWc>Kk*mqYzQtIk0$*$;St=4TnpFm z(Kl96RwyUz6Te{V1JtV_%sh0~+=MD~n=%~3iL$(2zz(}hPMeL^TkW>c>fNt&p z40nFlU{PkE5yC!C)6|I~ZnR3&8*@I31mF9&XBy(>o!8glp--|bCqE0Y&mYst#|j`L zwUBh9Q@xJoN5_=B>;<>md@yuPO&(BxW7|0Y;N zh{4t{{smr3i)&gbr2Gt{1+|*9tEVl%?YzvY)<+bHVv$KXwQPV}$+nfDu>P>DVq-P< z#Bn^NBn89HW?FBm8=5{M7#UL21IBo(8@e`uEyX3X4B?9;@c~;Jk&-=;Zy2RI)?aB^ zy_6X7NG4SwOarMrj+Nnov zjf;rV^QZ$1lAsb&g4s|#7K`Ido9ni@P%6jK3x)tCx_#9LS{|=W>7AvRPbmpUxV*!DorLlp-+mvP>od&?b+81s)(88BGG!k z`322~mn)7y(R z-nJD(gTv*UJ<<7KJ1PTu4u80#x6#2S`>ORJ;|o^H^uZND--^7GmnFx;A`#Xn?W}JV z5Bg|3U)eGKymL)i*E)+7UzY;r&IDwvK_b{@t22d`0A@XqqA8Hoi5yfi4^XC&8M5I@ z)ZkCE(y9t(O$2pRjQvJu@@@|F!h@c#wvM>*e;mZQ2pF$D?vRlx?slBYE5*jE_Nr|< zIQtWtPqtD$f_`Xg=PxMYsB*rTQU6a&+dgb=;%pNSahbqQ+SNB>FNs_(AzN5$8W;!b zYl81{EXz&r4O?Qv#ad4@NAQ%aX$#_{*F-oFv2Qvg*ZfH-H$CEW_kX($nZ{hacRtQ^ zLWe#=fJ+pAsxS7w>p8i=i|ya9=@vKdh2?IXa~yrXR!jXTzD<^=dUGb(MEAHUE}f(3 zl<|E4OoA6P9Qpv3BvUECRC7miRd74%RT;%q65`b{^Vi#`~ zX(9<$;7R$ z;MN~%O2fO=);cw~#afUK+}V!*KHy%IB~YdlM;<{lpW%V5Ylg>HJDm0=Z9UosoFkwn z9fkTz`6!jPe`SyU{zV0a>L}Si2mIbHn>i8Rzn8o?JfvLnVFPe z%5nqzyvTWNxCROv_KuW(Re4xqS>YE($ zsxUt*-vg=8L;=>|Efot)ncu?>93+Y?`eFspVlMagD0gpOS`sDAWmQF52n3SU#5QZ3 zzD~~^Z7lmh2wnr^UH=_bh?4CQGEmH*Yc_T#1tA!%kSpMZ$Znu1v&B} z^C9u-{|1tZrD}PV_~Cty*|hs?{Ck>WG-I5IrIPr7Q+m|xjp?!@vSKC@k(H7lra){- zQQq0BfCaCkIr`E~V-9%1aQY@JU?dRgLx~rkhCF(PO}eR7SUz?60=f|p#^#LG^Sxd1 z7WX(}-Yh+}N1I8a*Cg6t(l?Lb+tzv*QzAwsGn3EH6#x z771j2S0rG7@R*s_Ocj8>VLErn7dY8)l^nG~)IJsX`=MpQ56b{lx5h{iaz;3xVK(=X zC_M*&lJnMNSz6>e!X4*I#fOK(>-l_u-iqh?ajd8hS+-LHoNBp)bV+2ZC9bB(R)G>O=%Ztw`XN_A#NvPw^_z{9UGf0U(Zqn2!t8J zbX?#aa>t9Wmn&45&^Jk%qRRpj0_YJ33`4(IYAUN5057BCKC({YTpFrVJKLox@Bt;HyA8QPyMD2NO!syRdK zw*h)E)z(venXHGx=;(n*Gy_R=Mm1RYpfSNV3d0!X-9y`p%63TmLoV3+!$U!lC3&`l za;u|x3eS#QX;e0h{3uEAynG+?^7!5JV$Cq9OkS+6bqzfp2Y_Id;;@jT4 zxMd)>VN1VR``nqc1|&?)vTWiIkyvLH!Hqrpoe%c#T4sGH^8NLjP%!DIehPrJh*Y^V zX-19I^xNX69jGtzJ?l{$t%(ArhL|CciO0TV@m`oiCW2~Jf&N4xTRr)xv+{Z(K}Qg7uC~%Eo(#t_U!F3{z{aL_6zgyHG{kv7 z`;1SXuTpI&2L=Bvgf0DJl_0H~goiGL+P!fEL^V|Kzzs&Og^y^*c1W9FvTBsZ4GB+$ zD3bm_G%V*1;}ZhVwO8I!lFd{XHW#Q1A@(ulMnDoS)x0s{Vkq|Y!q%iNpRU>^LCM?n zWBzXpHw!fXGL0%ZB!4$M7q%Vb>LIp6TnYs>pXP~jOw%&qID8cz{Miwm?&Ht8TX{*$ zqb(L`(mDkVutniPNfBsF4hM)FB%>gMYX4z{mF?^mUq3iGxHKd97Nm7Ad^Gv!sS!wm z#>LYh`r`DDX%3gqH2$DfhRw}-i*F*>z^4j{v^QU}@oqxHvdXboUpN(IiLOOO8JMX` zbZYu3-Olm28z>&uh;lJnG?k8C4$b-;I9ImEhk%>;(=>oRMbC>$iW9x@N+%vuA+<{* z3oNC)V0k1((NJCTY4o;<4*J%V+Z@e1$wk4ASYPCqsMZft!Jo)2vc{soNv6>RNgkIU0piV%Jp4l=Ogh zisNMKGcBWVe1icP{{KfY_X&M3%GS&NpmZSFKY0gOu2e*ft^8G?`!Q&zQC|>^oTJ&3 zR1ZrvJ(d?+7ERyMCVSbVLd+vII7?wt{IY2$s`aDU*0yWBOq6f6+1Z%lvBmS6<#;Mp z$jEQX`5z1eWko|H66*3;r&;3tyfA%Zall^43!jDL?uDFoOX)-_3oJI$zYPVFZ6R8AWmv(eK&3HI)q#Ks z9%W?FN-+>ghzq-1yYLf_tq*~#j5i6-KSjs`CC_Lju+FhIl{?RP@Nh#&)@^qUw?V5e z4$erugb*qkJ?FZ3s7|X{0d|aKVHcjTt=u~PHfJN-Z2I=3$j^ZT86bDXkhT2emf&rWPIsNI2mlWoKt_}zvcq%n_ z6r9>eRO5hmtV_?*$-8BnrGw$z)<9l)dQk%>dba->HrD@1OU{!j0iu>UJ70&4+g_dp z_h*%wXPc;8(xzHhWRD*m(GL8bue_t34V*1&_lGF4HC0am$FVGgtW^cF6Cmej9&9 zc`0Yiv&?kTTJF0FE}&hd@A&H6m{2JZk%U}8O1;@X$@yUPg z6=cK$tU7V5RzO%E2op6Oc+&83#^V*TZB+6(zzirkRrS1kq)B_Mrr>j)aw^%>64ERw-);kGpr&e(LTosSurxdSZp`P1d+~C_VgntlZrz7CFn} z&>)yCjgE#y{OuIA6AR&Vd;n-@NSX}ze8p!G4|V)gE__p-?XD-eQ8$KOsyA^eytIqG z(d4ILOcso{GpGH5WXr?E<2{`dsv4V?@D{klWi4S23u5AM1VgRgTJ0t-VVv9jw^5`i z9EH4j6@%pI8rNbGvSlY9k%N9Z#sAG-Nj8Ng)aj0J+t`!q`dTWbN-+o1a_ zgJXvdJ~WECh4Oi&j4-Q;NOFHB-qijC%Vtyze=ynL z_Oq@oI6*h$oa(zgh-jl^pqJ4_}WkP2=wA7+t;~8*=j>Yiea5Z2*Us$l^7iIz}8GqJ)^O`Y~7U1MQl2TvqCF zn%P=a_dL-_>}JQ6g9Ox$yu7}A@zT+V(tu zlrg3*ns(0~a=A$l_w?iY1aWJad|T=v$&7R$T%Zgj+C1y(3U2KSu~(+KvbfSylEERscwx?#J{xJ-p^!`k2`fcYU zDt!P%){f$In;bqqgx&<#mXlh1c8 z^Wq}*k9kaGuI$M?!yr&y-d3C!cX-9$i+M|4f)+d1h=xq6#1`(D+4`PmM9R1&$KKap zDsx?J8WVh%SRA7iBNyrs*GX46id=a$?DKT%uyoHk>NP1OU&z*|z42mOuu$GxtxkP| z*Tq|WV=s{{X2ykiUS7s70D4FGWJpZP0x9tcmd?u`#bh4Ejl^sp+A%(!vD?ETgv<&> zR+=+QLGtRw{EqB1m?hV{#k}mty|v!PLS>%5M)E|L2`ag@g$zr0zyq(G@GoL1q7qwN zREtCM;np>ZA^nij(oJTH7#jf?GQ}YuBKxfQgRIwpu7=`zW8tDPDw3O@jBn9i<=r5+`?t_Hu($ zgGsePXmmK?XvfPBF>KaC9HxIoz6Gq`rSpoth_!cWeh|LWnsEfKrneILU#pV_ZD9PtciQMQjAR`mqmF0 zf%idd9#g5CYGYf{j$Rtx;&dmdZ4nWt5oLw*C(ZJ^VB{akqKIu^7xZQ1Fts zSv>8uOF=sWEtfc+2hKq18kt5JwE;(fx?cXrAWxgy`m;Hxhgx>_A)TV?yGrS}CC;$V zJ*&?}N%SHBrGGZxSW2!KMdETI-nvIi2NO+skwAk*#vM+!mv0y0cPsZ(qN-aWdRtMv!#Waf(9|FOJr}p-T;&bt6!h1t0XXb*nT+XbP(ufTr$_xnx5MKW$D)6zRly+XQ zYyds8gxgYt*lVBl8a~yFMO+<4-PzUT)v>lm@qAT zX>gYUot75xxqUrvu^p|q_IZri$kKq%mXu0Zi076X=QdcgV;*7%LI|!2Qkrny_xkIV zghqRwYM+sc%`W%+V_LJ@D&_G$F7DI`N99&G&BHPvNayEg%Jx z2B1F$N@Ym~Q#e@|IZ?L<7mxm4LNwXy7|-q&9^440wr1<g%&3p-^ODdiP!a7!s|;(1FWH9=g==Dmh3u}&p_K)G%pgeZ-^lTt~N*s+g@qw@#$ zl3y>VXX%aMDjMC3t2{4gI+Aj zX@fkcmc;8;q84*`0&#{EBBpnU2p(_FywELBtN3lnV*h<>tU22am*?y2v%T$oi%*nj zb@CQMZO`faXpgTWr|NVfX|8_)BWQg7kdb4dB~F;DW5+rRwF}ZKsD@ie%D7k`YGL`Y zY5e790#?B}1!n=cXd8k#TF}-ytao4)eBfbZHnMaQB1T2`O}z$v1ai=@lj4M+6?kD) z-9>2#aJAza2+k>eW#!bsI0As3vCm!xCmZ`silrE4_)>L)*zK>t=L($Ah8SgW$5mApi)y9J2~FX#^s$F-qx1Nh4@L03fKLDYP-TlIil@?}&Mb z-I7&jLhxa6m)}%2XsBVsVaoh$s(1Vn+Lh^E=J-YyyaKuJLACmL9lBg5Ar9B99D!oU zrDo*&TWCB&LVRmzug!WAth1t%^vTvF`b_@^oiGFeRV}^T=Ty+_bX!H`SUwNJzd5!( zi2!tZlqEqFH5PKJV89afkZ9%c2jT=BUcEUcGsa7Did%O8!X!y_3NCAL9{qu^%jb$v zSmHGqDXxKa_Kl1t6&Eoyu)VQLe29*)6*H38RM6Q3NzYtBGWA&rM43dWukj*G>35d3n$!EAvW=nX;28WqCaZKwrPi?mi8Mrm$rnl)Y7l+N8lF$||h z7s88=U07w&KMBPlc{_RXWOUzjgqerj+z!jABAKtXjKMn%$9{>LKivc_Zi_hg;TLOcZi~$q+5#$4;#m8j?M@3+E;QVIHn!I3 zLuKE|MJ)p!Y|Ovp+!D2NqZ8JnMrKO>IwiIp9825ci~7K+IJR{4-GYmpQCCqzd%u@8 zIYt->B6(PJefAj4mTo}i*C47+BkrNu&UdCiVilgq0Baq;=6xDK>89}ln7`o`@AEwP z+$PnUidW^|Rnq9AFc^_`P!>Ul^-}=l7M|4~`*ETs0j6MrqBLTkQB4{Vh2GXg!Z%*Y z)+yAB5~PgoF?OM69s1C%idR?r`y!Mq)eqMlBhpy_#)glE*Sr2!1`cR!G(Z70>*qB| zD<;lcQ9kzMF7`N4>4SJ`gV!lENarmvLZ|LLY7^EQ-NcvAY{Jr3!MPg!)I|Sxb>#<1 zuvv7Kus6S599(fw zKr{Jh7%sATqX0cX!oO2v0mxR6Hduil;h#k)(dn+8?RId8Ur%uss>q0V*INOw1rMoc zw;!s_sOc&Tizo3w`UX&j*WM>Hjsx85bc=2R#&Tdr@#giXy~kyBl9Rq*ctD8%G!46W zL&MWQtcjKeRkY2Wlj8=Fr}auD;FM^GV#i|{J;w8QB)fp~f?M44HPB6dm4D}<;l>nV zovJO)2yUj=XBv;c5hDo=^0TU*SCxM4JwToRAx5@gue@#^y-8Lpz7JzVvVy_``Z-0L z#TeE>;HMLqWqVg zUzTmTWynr)FOa^5lyMfZG`gpMj4`|h+|qVZu$!{U>WgQp+jU4kVq7y{tpA+@z^lM$=)maBEQQ?>q0fnw+E_EG|KUjIVEQtY)Srk(*Z^t?*z7rVmyXj zlJ*YZ0j*GT**K-B(rp^&B+u&5oiyr_xuY|0M=19AV4yd0<3dlW}JggEcom# z*Hx(7bw>WeVmxlAuc#o?GLww$YwlU=-kt@I+&?Le zxv5ZY4#w{9%15^Y=f5s$Bu3i#57-MXtNeT%ph~YC$*I_gOc+uM<&o{r-0X^TlMlJ@ z*#q2?5+MU)QuetFbD0}EeK7p#edqX}-5nq#MBun8)J?f*{snXeI@K?g{9XEYAi6&z zYqw7-NOa026=!u@`EP**G`kdp)xwKh3W=}F(gYkgLpSclhKX9CQM2oo9U{@Q+FRtE zS8qUzSxBO>j)uF}_V8Ap?sSGh+5Vl%IrEpT9I;AD&VVe*Br;loE8cr!F?~i4Mpj6r z&@DH=at-39yf^R_Pq`A)JOek~BW45-dP-e;m*3Yj4X-kd)RzCb}S)`W4R{}!Kf=3Df|(yI_C!N8E(XGSe|DPG7M$>t@1x6<8tsjZrqKV6xvt^jDA80Rmxk*=mHr z>zV*xEHOWcXVfv;%UEu?teY(}tYO6J;#Z_HVUCvH2}ZW2YV4=JoCPzLI%Ze*xhD%M zvFt!7UeY1mISTu@9h0Iw&BDosy4>mbM_Fier%ZV9sFt+y{k;9dwpg;wIZ1O9sVACK z`*B#)q1dpe@svRdReoyisn>SmDtcQPUeD|D!xLS|7KchSLDQ;UF9ljP$RnziPwduk zVQFV`4l_|-PxWo{N>lY*z<;Wva!xHG%>o46iWS%ZiL%l_&Q}(p_8c3Y2us~sXRK9y zUvpT9#{9E(#(2fQo!@NtYs^6PJ^(UI|wsb)wODnw}r0( zYHKbY4}zyWGqUiqQRQ*{IG8QFz<_vEOZfbd(|I4(&PKzm&MW2UYo3xgYoF+(yEa-$&cIMa>u2c80pi^GQQ3- z>%l!AW`;r(k3cOj34_s(8b?S8*kp2{+_O;EhNMbcegu*LIj++;aCZLrDE56GWut5N zn1HcAEt%dmT2{lgVTt3i%|{S|LBf@_TPP<4cd8tOzamY`^dCH9P=d$Avu$cim0Tn{4_Psnr1L+_wcvZ40Lo3I+hkz~nZSi zviZcvH!olHOFf4>6ZLm3kB0Ruw{>0tnfh9u((kBy!}d5IUgCfwrUy6^7}Xjmn>dd! z7<^eVdhDCWV+URBmdb3kJQ~aRkZp`fOO>R)SeanPqL?cZdhAIPed{`ESN|E(?a&?j zA!@O^sB+|8#A)LTooci71KstKpu)Ac9x0MmgFbzb@ZKAnD@(HDC*m2fNve>?DRqZzU9Xh-dp>StB~^8lFsMCKue3m z^P85I7$$~j%npcN5XJur!4_gMd1qP(DE%Y?A^CsPj0jqq0}fEsMqLPU2*00@pmNZT z6;&)28mXotgM7Z7LJt;YjZc_jlz`&XDZ!zP+^4|3?kz&BnSxz9DxO=P_uVyp9>g$V zmx+wqFK#1(J7;3g*%;f^2L?Yc*(n)))Y}6v_sjC}O$Xg_+Xv;S>W~L&BA3{^bTju% zL8=&d(Rn5@pJ_X*D(X&{s@~v zI`~&1vwbItg>jV{Or!*-{9>WlaDWT#eZomT>UQ99Tc(!T;G*2)jz1|c|Es30sTK?&BkcSRyfSa@xg9|2K*!x;=o<-xfB56HwO7WWNe7=Xj%V)DCw zh-~F=+H*~$E7PoZrhLn>(E{Q6#LAvdtX`Pz7l&m{|7~zb{SP+5lnP=fQ}P`t;HW~X zFN-1CE>fi|H1&bRcOHByp5ISFBNDxyk;>%fqMN7(NEC z4ey$R(3lU?J=jkgLI8aT(FUV9%I)8kLe56ua(7}9Z}pHyoOZmseh@Bi59K|`tG{QpC4VH=cS@~ zihYLIP<2;{Lwd;in3d{TT$c;YDWHKD_}bV#Cwe^fkzw(h^$IfJU3#m~^j|mRPq8I8 zETXxJy^&b+-*C<&N|tN#DVwU^Oa8CV?7Jdz=S|a=l97CG9L5rSlsL^=VHMQHkC1K` z8{R0=u5pWopfrWjYPKSQI886^ck+{v6vha_#pVogeX`WS!;j_WckXu&cZ+$LJ$Ly! z6(9+?t4JJCT1X|s(>P$^3)nR^>mgZVIRP!Yhe51CTQ5ZhN zSbHq?YB;le%*Mpljsri<<>V2Wd9Ooc4y1d~<7iLLN2thX7YRMgcStIS>4 z6X65@ZFU^xHk(~SOSiG^cFxYd$$S-5;T+v)BcpU0352G*O#;tYJ1rr z=%~59Zg=v!n2>yMgHJ>1z8p>PSN0-x^h|H(4T)BLF&vDq3u(P%>Eg6gUFJxTL%ub-KS)?%(=KmLDIc;;38{n-};dez2)yhyN| zt!^fG#w}pkH|D{~h3~hT(sW^8d{o7TSBSb7!};HD5#>pD_El~|BaOP^*#-=SUGeb$ zc=`(1Bh|RoC7xQRGeqBVK|Etb+u9kd;uv}-6yr|4o?~w`ph73DmJo)J(KAR91f@j1 zQg-+|)7;bdy+Km_0z?CvECJVrLwy21AAe4*Yr@y&Y&e!QG*;8+q9>G!-G&Rwe}&Xm zVIUn}Ib4(Ukw>eur~@n^Vt_|uL(6-AY<1pI-2r;Q@J`vMg#)`V{X-1B$Cxb2Gv#Y{-~RdMCB<>x9|p z6V3B({L<@ZG22!nm^zMZeiA!mta8 zk`X?3E^Cm>X6RBUU zt}D`9phNL?xXggYwnA`0)e#id*Qr+aly$jHY_Po8mwNj0Nv4>yutcWY(M)krQe$h} z8c0VJ$+sD9meBd26}D6eoxGobtNnkvgGqdtkYaE(8gZ2 zLK%C6CY-J%c%Is6P!j{MbE5}3B?JNHMGEb|eVshxi=N?Ck**mCdTFa~tG!E1~PtAdsb>zptqhbyc5IiwRY9YEQ4rT&ljv zYEt~o7v}g5rwJ`7gVOtp36*yD3%fXTN2zGj^>fXTh7buVNey0EPZJAiDD`nuXvi(u zhM^u`Xf)OFdiIE&5suI zT#tY|gHv-2=oStKktfiAWfMu`A#2<{QYI>;7OK{@xuz*oV1|2#9GyJZBQ#_FJ$cOz zp-!nd>MY0|8o167ssgyptNq@yRr-u>P76w?Df0X$M=DJHSbCPy$j~k9`R zw>G#e1B>)W+XN0{yHqVoxwm_YJttUcY)x8h$+qPEW_gA{2^HHnxc)90_+~rs|4(kU z8UGwSLQm!3d-u?jEh~`VIjmL3IS8~XD?;=Tj5Nkyc}Kx&)9(OrZjTY`l%}yyOMgzc zzl_a}bA6tT-*?(f%21Sa((o^1RcG@1Fv!D}5SUQn`6kuErPBVN?v5p^(d;kIybtz= z%_k~Kdqf5f)szy8(+aiY0xziKf~@e--%F`kV)-my`a0VkBsuNyToj$JZ5?ZC`YUXC zs<0cfH^4zWF+$BhN{b?%!R}Ouc{JKKoH>1H(Fhlg<8oJ}pd>fCLTV>)bbY@x!%~zR zD#jwvt6rNT2`U)(@w0VxiC`ItBxahHg@&VUMz93J0WM_V8%u@Uf+Rq7mg1JjBh=3q z-vr5fs$`CmzQ%J{a{GZS&dq?La&V;972^XHH*18#P!i>p)!j`;9!Z=|wL2;b6hN+j z4~k*rW)a!vm?UW1fG__~Gtz|)-B8U_Id)@I)fH2s$29w$a*@_SJ_>_++WpUm&dftp zsMUiBj26Hl;+|(K7-gL^5#`JOi)^l6uGu|SK=8uxK1&K#*?2I-^CYuWB)NYb%qj+LW~utw{b zR^G{%d^vFEOE=_|GS&rd^C27)QLi<}nTYH&J(thbQh|3ZQ|~8f8^35$+Hwohb@=g}vrRA=J5rMPrNk|z`HCad z@c>nPlLo4qsX?Y&Md{bz)EdP#>eq1a{Li`qN3-XFsTXRnULC98l6@x;s3O*7x z1;j=t&7-?r;Y};mHgJp~qdu0MCMeG*gjP&2teYPQ99MmnKsoSDyApXkTIN^%z)o3n zGrA@r43;d+lhg>xdOE-=%ayM_8iqlAABlcljyTY}W<&Z|dhXYWeJ!NyqXUS2wf{=} zU-Yl)PeHwRJBrfo4l)hF9{3Sz$?mWO$Bk&$?zm4!1IP_g*(~C6&KTYRe5qP_}$swc=qc6wmh~Z_~+e+dh-^uQj1M zT?yJH&&~}~`v9UT z>m!1wtK;E37xk!8JVH`OPOT2Qp}F-A&p{)QG2k>bB-uYPi~V$)Bkt_vm&#Rj3Y0~d z*&|d-HgTg{o=9owc*CLpPC^NHN_V?YCRB|Bn?@47$PnZpA3fVtaLx@Z^|ODW8O;R_yF*U|eojY|Sey49KM`c*lm77v+bC|y!xqfSBrCgEBLvVd}{9v=r zYZ(BymrEft#A2$Cy?Dub`mLK;h>1OxcMSLWvTyjonSeGm+59K(iqL7E*S&GDy88>V z5GuQumghMYA2DR`uAYQ^cYFek3f{|6#nr?Bl%OO83a&RJHZSGsMk*)ah_`;@oxMv9 z2#zU!xcxEx%6Z3ZSPgqx^9@H+H9^Jpt2cOIHTp0TcmV_xoXOhB(B@3`GYMCX4KAhh zbJ^EYT4j4tYyz1NYMA5buqeV0$^R}E>iiu0TCO-ao_DqYN8cn*@R{ExcQNi@=y`AY zYUm1@M1<7~b>^5sM*dxZn4X+?S*Skh2|#jQ;V@W_VG$e{l?xRhUU1=otHb5#k9NAf zAe(?o4vF6@B=9)Yi(VWYl)5bI`JQYv!?DR9)njw$N!}zHy{#Hc#UfE8H~=9fb|yKo z$dYvD0xNFz zr}zV>lg|)UniuuF8uCd^+o%&}Kx^~%C3@L~R2Wx(8%KX3Qce5SBGcHAb!cVI?92~E z?s#HCY$u*&F>8)jGh%(U?IPSPzQ^QZRzT2VdVtADwwF_Ch7l1_YDvBcAcCTQwA>VI zBPhs{N!5sxl13HtxNy;S{2M8;|3aB5Q}&Dvg$WZ%=ci3{^xlpGO|lA=Ww6`H)}L9X zAy}L6Zr{Yhv)7msPj{}rY~Xpq!_lfu>w6-fR|!VqQO$jo!O!503?{f-=6~6~y+N0> zYTE`$inJYc>*$JVcRV9#;K49Eg=&uUTpWJF+iX%pOunQA=&DzwVH|vdfO{8Y zOHzf0oYacT5W55Zp_Y_g@O(A`RzllOfwL~;yBg@7U%>Q5X;?=J|KknJ`U-99< z`TSl2;Vkt$K@5u^6@TesJdokELa%~=b8K|>jSKG-MbAZ&ETA8M=EJ6<7BEs-7*)f# z*y!y6F211K_}w(0=@kRv&!e6+!8Z#IGHXK4I|-9}4R_P+_rSU@Sg^=?vChb<2Sw2p zmtHJiPqe_ZB6W?Es2Fi8G2rqWEQmybtsVJN!Yx0l$hC5 zJS%1E9fWf2m>jSpQ0t!5MOgz;@_N8}LK9a#S0E7P1W(f2*$}LE@pt{hH{O0LtjTbe zpyX8zDbo!^fKU(Dphg_(4F3VAVYZL6$w=GC^6wKHA-4% zgbxO;`gCCSfO+su-s8_*I;v-2gshe)j`Q(579n3fr#lrK+MkBf>`fgNB`5L5F=#Y^ zfTP?0RB`h0pEWs37a_-QdSli+gj+?k^vA$6Qkrq?O}F)Okcc0m2--HD$y#rddnrL* zmkmlK<8pViu@r4|zo6zCXb%BFUUFlpIhcENZdZX;NzG%8p{Kg7A8jirJF*Um>qXwJ zW#khsdz1bx}l)Nq#G+lh_41c}pQ=)B;R*20}IYqB!)d}@n$0=+4m`LMuchNd? zrsXc|3)DTFFy`&ea;>L`x>dU;2%4cVE@DV+b*e7KIkiq<9tWjD87Bb!z>Y0+HIiCm zA5`IhPks+=E842@1$#mR+*82MlV12h@>oo+^zfK)!kDe%0;RAQzuH#WKJ0vu7%_^Up2aby=Myr zsYq}{!5Qi|IbdI8>RuH0yecpO(~9{_Gf@qMta&u|c98mBA|y}*?9DZpc-$Zgn`p0M z&Lnxq3p;Nkt>EM!p7t(jZ7UzygWWs|P6+V#D15SshjQcD1}dl*l*|-!)DKy*x63b` zQ9I#dq4M?He00fkUOCd-2D0+%;mv>`JN?x&S%2miR#maWy7Aw8gy)3p-n23qhCcqN zNaiIGbn(Z}1v!KEir}{1V@4c5Hkx%x%;r+F`tD$K5&gZX75*6NKM;JU=H$x$wEn^% zgl&RjcCcon4o|7q7`G3hFB~!x;vyS6Vgdl#Yj@s(aqGZfA2KdX7Z25*ACAGKt#RS- zJg1@6GrEnB3`W26p;~a3k9Mt&m$NUgO0A#E6T9@^Dco9awH!V9r4m? zLk?#O^55YlMsO5`mYvy}ind^D{Yt`dzDI|Mz98le2B`O$-sxL!_s2~qkD%8XCP0!L z4BSksuI$XcPV8VW9+}5jlC^=UUw(>CdPpk%!2JPicR{(Q$C0)9kchNqm9`{nXFrkA z*eABAFphSe$Y6Q7*u6`LibP3ULH|@9Ek5EC*cd}?RS>)@Myja|##ArNf^P-j9*#cl z{VYu8*OpbM2yoNYuU*#E*#6l$VTEZOQvy&j^5f_|dFtn_+K+PWmf|I^$1irm5_~wL z>3^<_;~?;VH{Ow8WqG_B(Zr`<>;lih91L>-?8+V7m2N;`F>u!NIy!Sap+dp@v z2ZspWx>$_Iq86*yXHzcQrTMB}GDTkqYfdo1<`=i>aO;V2bU0lv2$LkOg6B7Oi9; zWP*BRv;q8f+Nn$966YEZIc%kaOA<|u2mRA3M(I4<@`?>~EWskJ2`I=E;4o4ofKf7- z$Q=wF8`2}%we`ZQf$stASdBp=!7rdb?WoGvxyFm8U0{$j_fs{gV+~o3C-SfBQl!Ze zcM`RM0dq4a->FY~QyV|jPY)HM?f)xLJoM6&$B+Dva29rqVxBmrJbJLLmN&6{06u2{ zF|M5BaEy&VXjRymvU1sffwLo|x)9FC=bmKX4s}w3g`k}u-0sUtj8AN;pz4m+7ow#5kzG3PgxrT_%2lmfVrd@pV;9b@z? z^Cji7p6SlFxD$^PG`1w?a}iT+0O*<;R3KWr7IL`L^0#+~Fg>RSj$0^PNvkZh{Vwn6 zH7&nne6KiI#&~RG94Q~(t=m@6B6a!6CoOHV1oY>Gga2D$N_xDcK1tNEwD$>Ofxcl^ z`Z|)>r^`(v{c%hD_g37xSpIz_vxZe9Q1lIkH<`^CfiLE~m=@UG6@zmoYGQcwN}W?g z{p%z3Xi7O(C7(dTLsHdYx3sK?{eeqHAqeL;$^JlV;{J_?id3sLBgExF*YPXpSzZeO z;6@h%2v|9ILD%KjNk6t+1qE-_HvqTWHC zG?h5NFPA=a6G_~8`aYvxB-_H?+fTIv9}+s16{ zBA|a56nc*w2Vj9N*1`{mo^vgB$|kPn*G`T)Q@CjC2pBhnW@tG|51Rq^b5*6J!Zd57 z32sAte`HzCkyR|nBL1Bw833&J10Q%Wbm$-w$3xHzU$H?Mf#dE}ooFz#ETd7FL%(up zIm}gbr&lxW(QEeetoAv}qTF(ngN)9iT4T)X&YbwPoS5(@!V!EM8T!8#RBu!UWhkzfLlc>6=tWe_TD(&qcpP%E2X;KlC|JXXu1i^gN!5 zh>~v@>;8j`?3l|Y7d|PK@+zg)dRKI5i=)r_upZsY9Is@J7HhpMPYP5YSqtX;cVbd32$~-No9{mnBUUVl%iFItEo0=9w5&=F!-}3J`OIM9CZ1&Q?&VY5 zsn7ITZXiv1A+E*`y4XvgMHh%{UX!pgcnBYwKi#MgG2FZ*C?w2h!NJ=(-n(qP~vp8tW3iIGeimqK8TuQOumY*3SRNBrt6>gaN+IH!9Jntsj6W}!IEjm%0n{js!XS#2}?0LS@Z zMW9WmJYtzSy3zSc1^oG;`b1xyyOS9mtdMPXeveL}S;w?*iCC;V0GC=>ktsuXzD2LGt+h8NeV1rtrjogy)pV5-f7WS<&z=V)|dKPC9M$3QGDxFZ&9)tc&f3 zbW~FO(f;?+*+Z7*(nO*n4E%s|A5Uv=sh8G!MqDfQ>jPD+O53{`mcH$v=)HiEF0+qw z0%v-7?Z_eBIZR9di$`MUPPt&TjU~(Zm^I}}F4esD+DtcUQzbvgK z#%H}zf(rNdC>4BSGP=i*EZe(Kk0uP$ol6J2Jstl$T5d_BaH7AsCm2E&Uh4g8k6a|O zMCWbBWl4#LRaSOiYb_(cG=vA%NZi&98X>HNh5WT|dbHP}<;-D{%E>ia73u^VKE#~JQX8e}^uP3u0+Wh^Ha~#i@!lWH-uDE9 z%N}dMpttM+V8y*-x>Zkgn}7Ppj=LdBmP zJY}$pnBIg~@RtDzm7(t2$3wGRI(T)kx|l17xhyd!bm|My=d|c_oLD)R0Vn~zF%lb7 z(uzL8p4BKqJ~bsqbboNISf&rJ?_?64@BamIEePkXPTd)xHa4~j(n=XZfZ>J=n`$S8 z7~-x!hz3nw!zSNF`!6+@DgllhX!$u43gChR9jfn)VApWwEp|5}YrCGTdcX>FvoY`= zwQm1Wr5pH1Rs+(>aa<#ZW_=8w`y`}&wA;h^n-&vNam|M*dw<+Tv1i+gV;q&gM^|*_ z2pBq`0o}SDn2;4x%)>0(JbIMGzu_xD;i9q7`9p1b4-edJ^pB>jqGt5t3(C#lZ!&>A zg}9djuq0TwlN*rF>sqyW;yDUl-T^d49+D!}W*7_!pR7Glai&AF1h7@Kky3lFI#$6MuURhnJoKgB8ZrV-Mq{65vHKJx&9(CDICrbo z_Laq_FSc|Gt8dgvZFu!csv^ZVf+VfRda)>4!@CtcEXA*^Z+@Nk6L+(r=lFEFJ;|5m z?y3EqTywAU3dou7d;$LswI!6i@pKkOMXL0R8Mhapky-LRseO?45u$h8b9JYy2@;FS zuS`ok-c=h*zX}eqVp>7L#_0TsbvFZ^DX?OR9t!P8AO9^9S1)4_`@6E_=ZWbXW`FeD zr#ta(N|UG#zk0}Yk&+a2tt^0-TEQy{>~YOI`670S{1z_bidg!>jiD2e)^ui(_|MzF z15`<^h!|Nd(Vh4c?;1IgY5`RYA5@2l5YBn1!; zl$YESl#q`LyA1>cEs&k}`dX$8g-K1lmWsZGZ#?of*1K3dk}EK?4wf7~uwC{dWto~1 zrjDiQ8lDwf5FWl3a8@}aHg}W|zDLx|a_?4t%+LRZfnFt}Y=~>Y+9O!nY9%OkV@v#a z)KBbqRUBe)31?mL+R}c1Mo2}wU>^Lw4vvze{Fcc42!gG)XLB{6Uu}w8r6ozd77Urh zZo`2LBn*QQQ^7&7Gx_`P_Mn=uSq0;+ezov`t zbI;yB@99PHlY9FwzS zX{ORaoV@ud(0IyLU7 zP0fbG$F)hQR4qip;pU^Mhs$){0WD9R_ArR8+uIG0arbiW_*wy_fz#JxXc>&MpSt&u zSh^uKwR#Ec3i_PFvF!hZ2gdv%LQe?F;Sv2xl1@_CiWH0UEYd?J&-2YkA<*Yhn4N4% zB#35KDZ%f;xoFQuc5)0aQ;SFw6F#p!hR_Q z4X(Mc{#;t(Ecd2~Xxu>Tb+*m|nvs2giq+hJ6bi%PuKOWy(eU z^t*(DiCDc+HR;D3*3&*#@>DdXi$d|bZ8{NJU_HCo` zzIard+nu~qm*j;aTSV2){to1mP27twcf+{2JYw=K443Dh-iR+I-;kTf`B!VOcrI+6 zhkT}L#Ur)@Jh@E#_g8de^NAH^U(Y0vz@~9ly(&sQHsVP*f{NoWl5$6oPhO1|YAywD z4Om1VIe&uQ01g?=p1$JivdV{}5(jes5TA$K{zia~+T86j>YmmglKAqajK5)T)pjy4 zlAKOSKQ~T{k1BqV0v%sv{p$>0YeRvq2Q6XW_v?ty0$ep?K#$?7mJj#2hkpAk_0jRB zXsRga?j{##^8DdnW<3K2s~EULDLns9R)Q5P{MSd>Df0@cz&5Y3A7w9|XW4E3?}Z1^0&4Slf-z@0INg}gz@_iim09WZ zn|98&7jOyiG5Cw6PknxJc?qX3!9t8~QLwNLwN&6Dm&L1PfZ^jQOz^YQL6=_l+Ynsx33u3jXgmJ*57T#i1sk(> zlE=uodEf&9WH|k^ zpCw%`DFQ~n2%;BaU9DL97-j|$bN9CRf%^g#qJM7;F^)mPnfAVfWx7vW^% z1Nl~>qC%C)8zCG4?JPIKL*xr}6O^X!&hb7NvRTWyFb{aA!Z(y&Ctcur>zsKRWXz@^r-|w_ z<~7;XLh}da#k`eNwhsqB&3?1!Q_uH3m?|_EfPUYL4n@g?7j_x{ReU~cz!->xm)zMvCHWl}?AS%CuTJ8H@y4s44fOW2wfBnKEJ*A+cfX9$a=9 zV~XaJ8;f@EXxu1ZEOx0Sp~2w|C0-swp8(pYYpgkpz^WxY`~z8IuX5zY*#3nPTTsgQ z=)f>p(h#*t&}LDwc=Ud|)Waj4d83xUxNP~6{BP1XvmRc|X1+I20m+dBCV=?Lmt?Lp z-k#)9?ay4qOT`fjFdDR!&Nec*356?A`52$^LKVyg z=>ack!&mM?f$+vP^qqRmcXp%RYTEHK-=6&OZ~5@)0i@V{HHvwkpy%WPu6Vf6&Ab*` zJ4z9+7V1`OK-}O{C3f_9d@S!y5 zING2;Rs1r!OSjx@utTPh!l`>RFbY-3QrJ~W2O>!3MeA>J1MGw)k z{}tVp+DFxG3>13x_}%0%ljYL`L~C9}?HaM{um$AdR}y|kvRZ1M*K<;QMWW|@UqbdF z0(7}2!rc51V!o|E2!}84iyuZXs8}xyhwBiis~i*39^E- zIbxF{4*supvwLlPA^k&g;oq%H-9jN-C_gCO16pFX9&Owr^a&pQ=|g>+ht7oX43)vew^ zriG`wX%~CzM+%V+%rh>&nwP>usQ@Zn@JCBo5Em>$_2t)NmEnL_R((*umeqs0eSEe- z?KFK1mHKx`+#GzmK($=~_(Egt=Fm%7bZnTzV)`@S+?1^^TChzpdhu1piVhMGYrHFF z{NfqsYwnu$QYBC(Kkpl*cjL)5tDgj;x$0XGmv$!uZw?q=`~ST z_=%)0neRu1^C1x_dQ9)Z6YitiPW0p6{sIbgRv>+U*~atsW33?rKb0W-qCTdma#U75m{Z;2z+n$Z6?JIF(Fm3g}S z=2+oQt!OIzy+35ObT7C5Ptxocr?L0Du6KqcfMg40&hwG@W!j`ICXJX_voL#DIKfS8 z$v|Vs8`Ho~f}AXeiipF)^XMd)pCS({n_dCEOVT3$8ZnsZ%gC8a>s$-yd{;v#e#yOm zLD9cECieizQH_3{@(D(!4?-1Cy(*@7knjJIE247 z3OZ2&Gqg^6)%>RTZy}lbN>U@{rpboKuif*5o#{ZSCNe^a68rt)5Nf2 zJ8L=cm!W`$s%*00no+;O2vf++_^}2$)JbMH%$9<4ZxzYxg?pwi;B#UyfPNU34h>30 zsZR(UO4!efXkxj?ITKGwRoK&*KDzZ9P!2{v_5-z7+JxT3b((4)E7MDR`Ge~5|8P3? z3+%sX?e!5N^Y6+*3dBEtoFa*alsbe({EM|XfNML0SusAHCNdalb3FPg89rmJ5)cWP z?mg!(B^9*G=fzGNyqQ}$!AGt%GZK7QI9J-W3KxMU?^Dq_^3O^o&RHMJz?p_ioGYF0 zG-2v44oGV9T(HzZQIud_Je?B{UW0NX;Gh=2lx0Lvx;mqpiQci65YNo&E21~Y&-1?t zMS*o*D+A>6iH9=-7il;HrXu>ijrJ=nQoW7L3_UAKYbc)3ikPziQKGD{ z)_yjR@1A`KbDPM_i5WpjtTVQE3`7S*^%^8^hXeX|*a(nq9Y1T9=HZ2RlJeo?8z#HP zOieiiwvfA~^0HoLfk#itkqzz+lKJbpo;H@7jSxqN@7jUq241ueSwbFTgo9tO1Ud{8 z(UbhwYCZ8Vcw}pRvC)cUKyhXM2Y~!?0!8Yj+>u8yM?{loN)l?N3X@+;d(2PC zO2D44{{syTv7zx@fKV=MbAl)&Cs2_7f(-k~>Kyhq(OgLBC({*YXZBh`4*H#MbfN;I z>J7QG5kR#ET-N-VJgPyxow6O^iOK}xH4##Q>_v8emQ-yC56ah0qG5@mzO`$DL2?{3 z9$Gq75HnGi0Wm;9CAPm6%HjpC@S8D@--+l%_)zl)L&X~;8U{ysoY|R*JkcTAUjokL z=p30)hUC>7wTvl?Q%+a4v6ox&Qb}Gyrv#Hro01EquIus^R2*9?J~urfZauJ37!~kj zS`^wz9kC<#JYveYQ1lc#P@@e};ktTrQmA4PTZbN7r1RMEMij%UqR}H_LP6NQQ+G|# zh87UmP>2hZJzS&$0k%xsYK|`qmkrm%rv$qT8VO=67pBLfxjIF`4-nquX0$S>LH&Rmd1JKZm(!> zJ^@WLkL)iwr(&)7BBADLD1KDs3?$Y{U014Jkd8x;x&>vuwezQOrHnS;?S$;aZSnRN zSMi4fN1WZgv#hI&Rp`@h^(52jT#zU{C3Yn}6&Fv#MrVxO0lBmLArbBVu^ggG#NAOc z@W=5Jw+EJs%-~Zd=>Xf=HAi)2Q`#~bG#SesVUDUDP7l?NZ;f88QD7D|+@ML%LuSbI zx_*I#VSx+sS$iA@4t@#BS7505o2g-Gg#dDl&atTq{=ZEL|}ru z$G@id1@XWdeta{(HlcjIjkbkTgxp!x*eRadaI*{Ht_2N7qd-~+K>R=6dio;#5MI~i zHr5}(ALmsSyiL4m#`@_cKLh*4mZ$n_jN}%=iY#zNv7x$*ap3R;(RvjK|9oHm%G0sAQOIC9HtNA!2F+7h&*f9)yRj{zCr@Jz~hD! z%Xn*Y;33BpM<5Lriab(9g#}8bK31>C)zs3 z3RwQ`&o>n)JHgD5#`Qcl7hR?axd9~$BI_$J{ef_6=rhZE|8&rU_{yc4u1BCmVfuy+ zCN6DW?lQ!Eto!|m{nd<97r0L#q}kK+1dY={9`|L|5%Ff)A+7c&9Ru0<{|38fE@bP5 zUC#{oarv}Q22EUOWOMHQgHOLIC)*g7UzyG*yb7(B>!R}B5`RmDd>iUSR4rIY{qyz5S6UWKs3JCl7jfxVw!O3 z3?WeRW4xggNTrkCs|mREVfAES8*Wz()(D?jyd5pKQOR7gMiaiCN*e(lM+?xeZ_nga z`nyMQd;r?PL(`;rN^e#EB>TFlHzz&VMLiGRiCS)8V+ob%AciRfTWf0bV759}1u?_H zHN(jF<~+Es{4p8h>kfoCe}(zU!U*X>?ZX(uM40b+_}?qVL5Xmr7((6wtwBfvSoaHc zg%`dG`yeuJDMd!9YG#93|>UDqEO9B%Ml%*Zj!tDYhk}&g)WV-4w~IF(t5TGKdIBr34uzzlkv*)D2pqooSSi znl|JAAD7>1N@eS;U1yrJ&rKJ61BOj&>MA6CU8==%0J zXp&4ZOyARJG$+9C=NqZN!DPOnG}KWUFV~A|4sRw?``Fu8$J3VbTdiwtmWxf|=npEp z_YrzS$?C)nv@T`_k*I~UylJ8t14!Z-P`a3r@geQL=6cKW3e@+?;47&AK~eRTb++pI zfEStRm$mLwQqD(gL1=@N{5*!cCtwutW$5qcjoE<+Cpj6>LsaonKc;tdKa6#M7#fsN zM@b3h6*Wav(cCQ5InR`s$_1aK@CeAPSXbzlh24(YF_xO*qbra+*W4vRXx;O~cU?F0GG^XY4L8 z#)_UENkg34g0c#>4K-x|g@!5T9EVO|a2)j+%R_2yB!us3odbI|ct z*nemE7B#O1U($!BGf0rKeK1d7g#|rl4hg@ocy{*krZ{HfXrHhPdfbL0Ru(;UC5!RA zv4j3&sWq&qt3*Y4+t(N_l;Am|8!fgingn`6c;Tfw4s#x{9*owRYrGR}w(BJ*0=q-- zWz12+iUSQ*h0{^}HIfTjBuH;y%Ir4+Kup#9U;)A#k6WF_HZiQ=Ull+>6*?O4rKD2} zhkq$HF>iC~pL$=kr2RNJ=j8bpVp9@!90`FYsq(x~d`FiE08;0;+l%`A91WxiEN*5N zUW`F1Mhmz`fn+bJ%DhWcroD?&Q1B>|{N0$xX)uVXz5=G9lNGy*k|Yd6vCSfkv-(;# zlprCz?oet|T1mgf#A}HM8=mIIXtCX9?sI4Ll1^u{ElH3hBX1w>XUCEIcgY|t`^4TX zeaN#XI7E)2{)&5Mwn4OD$H|Ct&O0}kb?In;rVvc#?+k4#$u_{+0NZRReGWU^EGR!J zc98*gW26but;>l%?Y5JHEnYq0QY4@X%@tUkhNG!fM+J-&xm$gVDj#EZG+Q^9BDB;DWlGK_=R3=Z8o1moeyMLogt?yENaq%qAuAusgPVX~f-W(T@{s_|J1_(QKbTv3KjB&twnMe6soyEqqr@dZw10Yp7e z^>1U@YVR7Z$Pb9pmwgpM{@$;Ig=!aQ*uAZBdDwg}pBr!FD?*wW+LtjpCO z58;*;w3xcI0UGx?GUk5~rllz)IJ)!=P25&jICdVbks}@=&y8{CrV*bN$gjYi%x=>q zJ~OU3@h>LM<6$d0AdsdGF{{^Nm`*m} zM~yM4k<+T>>DOod?ZR>n-t_a8lXEY?`u}7CS%MG?x5Q(Ajll-NVV0|w<8z?r#!#5R zi(E+UuHW)fwks8|jlG2}<<-(pfjC9Ft+oy6j316BIoJxR7Wm#w!^U|jz&@4n_}(_EP{dbrPE^gUeG=cAHYU7zpD(>9 z%EU55iV8BYVo-1`>JjZar&Q)ZV;{+5?U@3)H39R58>MHY)Rh)t8J(x0jo&OMBcI`B@zO2XIPf@ICAtw zSgH+TeZi4F0k^jQH$6ns-ZcI26)Ky&kvk~#Szl?mhLPyW+CYsZ15r$O#Y)UM7*a+~ z4D=vFzpDedC2Fa2oMcJ=7~j=*=9i&NzN4c5X5Vv4^!-txxi)A2J9D+*FMDZ`P!u2( zb|1(%24zhB;W%#~vf#0i(de)y`2mm%HHe90gMG%?y;Rz6;{7+&&nd$A4%L-p|9NAu z+5Ad`@Y*;LxPKCByEvBcerii_=3p`Pk#e=nq5A8Z54K=kZawnqFl|NefvgRswsG=4 zI))upZgHBfoZmW+?!e&^uYYUj{iZBbOvCWCP>&F3XBa;_-1h-Cnyk0bjhY^Xh9ep-HDn|+^>MNTsPwp03u1l7B`K0?!nJlpuoAPJZuFwGy z_~e_AepK{j7I~H&ju7^Ct0TVmO(4|&S}@bfF5clZ{klT#JdlwjwfU8(!ZFIaz=HZL zC>*xkIZeKFroG+JSz$_zDXu`mIKWu^mN(7)Za@L+C}?FmV8=v= z(*WMyJMrsuXBfpL-XTF6h>jx-ORBYkxVVw8#mZGG|zKa@JSx^)v`p* z@qIJlGc3pZQoXI?&I(C_Gq2`5uG5}lgB5z4L=00sTLi0dt zzC~|om5+5k?lQ5$bYuuGBRN*Pr|yS*XrYjM4ESeXF2=bFG04j;u4YUjndtKB71|`8 z(MpwZ?<@?P2_UV>cXL;&{HP=zFhOoY2 zy*c6t-Vmoful5s!CQ2ZRa=umT2O-_O8?MKS?T%t)aP%aK%Ip%f#ql8>dvW{5x)1yx zuz7TICr<93gZH_vYNy-x+FiN?arTB1E6zT<;fy`h!V6KTPN##-nSCj~F>0w6q;}|y z2UZ8|(T>u$F{ zt{7Q;+P|Mg65n0+(O8rFTZ_UaGfzxJPH4lYo*g>aZBoN%5(HA0ZLM2LuHMLv8|K3o z(&z$x9F3HJ`cOcCqD8f=qp{)VXa!j6GRnBm^@2A*EN`D}>Mbb8gMP)>!5vYLSnkh~ z$=sZdr!wd)e%~B+uU~S3_U+aFFbC`yEa(Mr8F~dZD>ivx5IW~Zfw84iTOGfLt%^5`kg*s;)VoZMAthWGMH0HoBg~+F)Z(b@<3}%PZyMzUiJ{6FB z#z=#T<;X|OhxQCkD!f$d!rpZ!GY12t+-cT3=f=>jeVI|hEkzLyDVZOlEIp~kx5YKI zEr&QAW$%br5{+Ldpfv-*1=aJcy}y~6(xP!LpHCWV+=1r%%FQF7fl9&8k6u~Hcomse zvyz&2onJ%PIuzV+t4K|k|9o3);{#Zk3bkefz4#7Ps6)QF`r^}4n2g8_hAohZt=?)8 zhDYRZBahsQ3$6~g`E)Esvl}}1neg;%QJXbr+n7i!sKwDuFylY^`-4XIxEatlY%PN? zboFCxBVqiuw!1a!enGn{EI^%6sOGd$;+wJiba(8y= z)}BVCJNrr*bE7T)T_WDHFLqwgvIg!`a35?Np`kpTH=~Cs6Qzt?tq@U|jtXVh9@v24 zDSZQ=sHou}6CHYHx+A_u9S&+SCd&odeheWi`cyN&PQMAa@klbjWo0Q}lPd8Ka=JXe zfEe;g@WVb#aRLM(mOWCf^dZ~@gb{$jioLk8vCGRMfK0d}O#~EH?RJ-5AUvu4|AlI? z7gOd?nqIb<fSk~)RRto7&M8R+>yEn>i)(5;%6dO#>Z{A7Ld%Q-FW|!f$wT`@INZGc z;wpEnq)qk*5hLvtV9s3(`Ne?SqyKE@VmYS=ZdB_@9c z#^nTQ>y6!vcydl3U<{p&)cE(dqOVv5p^+L;L-A1M*J^TvmHzPhe(%GJ{p``7ICcUS zTVgc#`@+_?cn*OWIEZ)d zC%Qz@ud_W;cthO2biC6?pH5EFR)1GK{0)~;BTeg833QZNh1UBtOp2dweSH*kz!qqS z2LOek`ykvEHHa?VJUt*uUJLlRFKVgdt_!K|2GHT7pCTIV3XgH)&YR2D4?Z=WzFLJ; z%kyP4y!k06stlUw$Tpn8g-(a}6%A*;MmkZha|op{KntHLqOgRYU%xQfaB@I{>udCIfHXWskVa6Mrv0?~r+h_T1}9lnxxc{djxH*FLDUU*v`;NnXee`;T>bM} z<6BGN+aV>%xi6OnLqPfa_VEMt5!zEpx1`(l9rLQZ^ueYSG6!u`N30@geWQ`=p)eH* zKx*i6OZHpZN8Lk`L)WApuwn(B^vTueXzMb#Rf!&A^()d}@Pcz;C45@SC&yMt@FXNm z9V8BPlY7!UXU@0Z)d)ce`O0)=>wdgVHtf9lgQq`c{?7=ib>bwNx-0;wdi_CVF^rTk zH{DGv0-8eb`$6e(AJ#@&%(muqN>*skP~3c&&ZRe@Sd}LALS$26wt+HPO!hWvh8lO1 zho);yx>q_{snG*?<_39U@N51to`f!P9C(TdlpnB0LhJ$y8SUKQM+D$#?R6-`DT_qW z@tgRz0k0+!;vy1^Q?%}dk>(T|HU2FLXRH*+9|Lps|0N2Ue^{i6kd*r9O%p*q`jP8{ zo~N^_aQDtW<0v1G03PPMyTT81!)7D^A4~+3ZuGDv%&V}cjt2{VO?}$>w5Ks`TE9(# z@2n7EyLBW*_Bz=@Z%aNi0-%Uq|89|}jSLnEX$vhdgjh%>kK$FIJzR-7sZO@CW1Mz| zh^&pBAG<$|QTY-LG@l;_`#!Xv)wQKf;_9;_Z09@hbCSrqcUehgKejCqE*|Hpg#R0n zIiU=e)ur%RTjCMGSTXxgK~++ZJOCp z2Yt(@k#mEJswJw5rP8r;pTQhQ^br;6*+*Sk^&r)un;E1&k~Imp>E?)|6pqYk+-}9q zy6p4p;G&rw9MQbl^Y(S+h%wb!8#|oOH}ne|{;up!yST?PI@+8hkte1bQ%fE601YRw z!_(9z zxvW!_MUqS^L{SfsfJc9NHj6(ONMkZm@X1ixys3+9B-TT#9`WazMmyYkW&PEo8%4}K zhX%LjZEeE2BWOj7^2MHKQbtnHoTu6^!yoEd;VzdK#$ZbQ1O?DEt%|TJiu4gO|8(ER z28Sjnq;o=pC-P-wvAiRpY>7>H0|tt|VBDw*GxtH}2K^ZT^XW%I0TP#Pub8v~4LDaE zD~M#_8mK@A9jIW2npqnzIj|7&dT0djN=_&Z79-u72L+I5#*6{%-0*#Xd2xg;;p&RE zFrdYb@{WHHDYP$d+0y5y^Q|UOkLlejUvSm^+`oI^%>ap=G2dC$BDA|pGf;QO=sqMI zZWI#v7l#u}1O32Ox2lFkm1i*WOPiX;4o#7%jPF|rO_6wc>Yanq0e<`KYSG7I-^smO zCN&O~dl{64)5%Kx)nM#JdkDtpd?eV#dDefErrndUR)dYN<0q2YgYyp-bRL$g-^@xw zmlT^#&HrwhI%U5l6 z{`g4aF$9DTdVZC;-B#!M#g2@JMXA6;056RABM`W%Mj-LOqv4`dvF?30pjF)(W5vSEl_x{yQm{9?VR*){#XT^rii)7M&6Umj7fVR!MN z!y4*fhD#o*37#-6JQT3eK^s|b&I247eoP(LR=(zq>_Hjz+po-FmG%T0{&q^%kD5_d=L=8HxNOZ4PwQfF0~1?*RHNz8dXt{&R#M?BF&^MtXN~3 ze}qYrhfT=wFW?hQg;HnhEnc7LSS1J#2`3uud4{*+Kw&THxMmwDcmvw0D&8OZ2U2K% z{nZ^I9lwUqmRRsd=U8PpBjfP7uwLRB-x>rZ$z<@%Vgu){tLeBdEI!z^r1#T3nrYW5Ibp z5nIA`uPo+KQkFc#A+Y|{XfP-8sIw>M_Mtt*%B`Y3aIJ`kAqGIaMx>$nH+cLaQ~7hO zVq;1RBFW35_%zGUBDqe6*A;&U-+QZ7@KrN~Aj|!JeVL$nP~jsYE5wWDuF!4BBhD96 zef;r{kvt9-2xGIvyxe9>Z0rSIgXZ7u#4*jrtMwOxn=y@Y&9ugX1sM~c9_6aZelt&t z(D-U&^)z`Kf_VmFC|*$#`(~7nM>MP}^m7Rs>Mg z^jBkb8~ff3;2mfoui0twm#S%tz^$dEZe+L0V*m|JLi8Pk=*F$cD(B)=(%K>SF)_l~ z<4Kb_Box!L9{^c^mlY(L&?APWl~lWvTY_BhT1y5}^OA-Q-`~`W>-!C!MO|A-EuGt2 zWmc4R!~w{2uc;S=JT8y7K-JL;E3ERi z@VC^C-1;!za95K!^|%Rjoy`s^Bol&@ki9CzAPP=1YRNM9SGnPE=hKh0JO4wlgVxWU z5KU$I=$`IN?qgxCB7*~ej|>!m$xi(cEMq3-Q4f*`2~lca%R=y*uc}x^sjf%SS&ROT z8J8&F&Y%oe)&NR_yCx`D(YaImbGGdCl(&P5`9+5$d@c5cd;zO@*fzTe^Bt3zEf>YY z&Bd@C7NiCfXqG!m^>0ZDkFMO0b;{C``p3}1c}}ytL*dW#J~zad=!4|IG_z>ra*ZWe zh$47ulB$K5-8_}H&e>R2;fQHaKbF(Ky9dj_W#?-uH5MY%q7T=mhJ(N>jdw!FY*yI_9N6tll;qT}z*vu;xjD zs8?}+GoPQ29!VXh@%;1GAEaXWi69fYULT48Q?x~0@idt@}#wGL_xv^OT zCt>Q!5lY>07wLi-4NGbuqoAu{f93N=H^v>6V?>|zDFM9(EUUm961meMN~DN>ttlCN z+0yX7Yi)#JBs$~${dGnp%kcVbhOc++9FgJ-!CPO8d5VE_{yD(IfuE*;y0;rqSU@Nb zCoQc_T#xvH5PshLw0=@@^F!I)>%s{LvPk?Hv$j4CM8qm3(4wjW&ZW4^|7>bI)Ik~Y!iz#(VEbzEu!%Y5F2>%C!>V9y0?zT>Uib8 zfGM9KqD%etROZ_;^wU+z(Vb$OFfMs$!d15npfdwc%>21Pd66VFs4w`%$$yLx*RHAH zNxUw~El+^M09Nx(v#f7Y3_hjlpDQ4!_?o0ihDRItuXYKQA~dw3U|cl|!lGU#voC%;R?FnW zhgDu$6r+;t?!K#lJcUU5twRA^p{*6q-e6$NL5ef<$Y)% zE#@L=rDLYm{$GxT%(?|VZ5?iEKRKX_<#wPk6t8R$;OH*t++WuBMh|_VWSO=pt?O}5!WG*=dv0(Egbf&={%r)SJYD)4hIm0MPunjFS^#7@CX{o#LFaNT*B zj@0OX)at1DE8qC6{C|SiVv&a07bbEr>tPIMFdi~SmvDV@uSN;hO0rmW4$Qqk3(U+6 z_r`DmML+gj&Vhv?4!irDS}pBj6?VkH#-JFB^ROoZInlnR(JOltN|I{j;o<$-(7#6= zp6P!Z+HWR!&ix7Es?3;eAa;+=7@WnhHSl*X2Xu-Kurt>&bX~(LUbla>J}4sAO4bOk z8@4I4JNgCXi}Mf`-WFs;@{nX~9g8A+R4LwoEHtt;bi#{+-`Uqs+sG9rZIm7EPC7n0 zwkLe$ltF5 zJa2Qvly8K&QTyZgxPb*AddJB8a7zW@I*EX5x%5Vv(}WuXgDU)gmeBrp&xX16 z2o0khz+l@JFp=`i*?r9`0TxJDQw$DeUAzj8Irh^_Ckzcv+6yD_Ps`Cce*MrHS0#2t z+Igq+L)ghJOW#_62zR&crMNC2^1gD}e~4MknA8%dOPbrSdVP+r>xf14B%F!mB~(dW zD9nJD{}Q5Or+pE#3r9eBUuAcuQ5zF>>ZOU{)|pr*20&f~Zy$6#L;rdF-g4Rg%3X9y zm(kkjzfeaD1nEzDIL|FOQzHbemMb9&4lXA13z5i13nXtK!vIf>Tq`2(#Z_qt@B#`t z6iB~oiwwxJ_#<$^$Pr)C&LN~7ha?8W*I0gI3~?R&7349qYYPsniAR(pj#c*E_tRvs zE#LAXvAh$uKfs7mL@qwOSa9E`$6w-{5KX3Xc9|zUno20iANcFeJ3*0Qg36(-i7cX1 zmgRUF{@{N$J&ClmmVs_p89;8|??DgjvnwffbCAv;q_@~DeN>CoQeoZ=yx``1$(k2z zLFg>P{J>7jG^?_Fn|{mg)=8qH$eNbQak9%`;9Fq_>aLJHG~ybH6f;2dBEG>)QB@$g z(=5)*)a<+1+84>j7ED0&Wr0?Z`S76Lh^hI&nK z#iDG?pD8$re4u$6F|5sf;fsNu@rSx`h3@PaI%v=6@74>2?yv|G8aZ?YdDvZ z;6=Ze`jSl3jcZ?&(dpfZdjpa&M%Wz&ybA+eObZ5g4@D&$xW8cG7G|}L9N~fSoNKSGUe*ABJlJn*?0XWQ`1L|B8fg@ zX_p`>u*-J`0jxRtL=LxZ@TcwiU|HZM=Ca%_f!`Si6KTSx3+{rC`213r!gPx;)18y~ z4_vxTF%Tq>YuMd`k)Z|c|9&%8u=i$YovT<~T$LJO7)q}B9X3G?kCXRT9eJKfX-gqS;5SFO62N?iQpXAs^D~E{C2;)Cal(?8> z)+{j3o?^rBy2*HxY2q*G81qR4=d}xwwYNGG?y!7gL7ArNl>rDv-4cF|Wpm|sv@?aM zVSiD5xme@tGdEzQRH1s< z-?a@U15?yWr}Rp9U0X5}$6e^IY*-mh{28xIHLBYg@bB}ppOyOgb=>?zw_G-u)Ij-OMR|1o#wGEE3a=U=O^O?r4+AV8 z>xy}C6maJ>*Yw!vrWq4&QHr|gv$ysEwbx8@NxdzrDj!ung1l>Mzr2h`p<3bU-{iuF zX9jm){4-An(>LuytvI>up#)vW%yCze&4l12eqeu)^}DcmKO5F&>4sU1;Mu$XHE}1i z6C(=3cl#`arVn{|ba{tWQD;h;CP46j?e6Up|Avs8hamNa74X zy!ZxPbsr{H1XF-2Gv*JiA@{+ZyKGyZc1fh?l^!Lev6Mamt96nNy!M1$E=|t<<1c3x z41eD}kIruYJ2;VW*7INgc{;b*0qn(RL%M4ejj&b+Tf|;PWL8ZIxT5VDr7*BYi?hnq)mU0FfM2yHui zxUW6~@L$mi~FJ`KCje z{#sV|?K=0JbQ-`8@95gcG~@9l{qLYld+9C-aI($Wc(mq!zZIB16tyju5h#dcyN6$A zEzs%xs8xE49iQ{!rygrlr>pB(OSJDoa?ZA<$%9PPMMic_qcFXVg>52E%|JYdh@I3x zE{;~_Zc_JO#MrjT#utDolOAe%kmsa?pK60!OHa6|Z|2!A1Zhewu%tQ+wO>VK%rg+v z-$%7H8LBY{ceoGpd*os0d7~EK$UL9RdxfJCxf8T(d zS$ZF^;^I8VXdM5C3~AjHe5YF~x$ zlDqA9MVb}TR`{}NveWHzz!`i8?V-@Wey=-@_Qt9mYJi3(`Z7n@P8;9Rcrw36MD(gx z{ddz-KTIVllXuV*l>>|MDjrq@@7bwnk9q1te`bNPYG}L}o1_fu(YcZFB!}7QQn9zA z7{Ou(@1VCGB;3XGE&j&x@VnvH8-IbWa{pCxCMH7h{9c)K9LUA5rv2|DKLu`b{xSp3 z4W!M$MUhM4*^A>wnmk&3U^% zmkK9=JPt*kW#lzNb;z!h%*8(6m`EobJXCN0QxjgBj=z#IrgN5sBqz~EY`UoN0+GpE z*Y`cESv}DuLhTRy0?$fz@+>onNWeYk5Z9`pTEg9y?@=%oLH{FXv&g(r!sYMalzP#h zj?+C8`ymBg`cJSPIoeu{EE6Q1)_45NDMn$L23*Dhkhl0M70HXX_*Og_-L?F}dCCV* zCZ1E|g5{?mcpZT_9YBjF$cX|vSbxHf1TMBuS8FK8G(&?giql{4X^6`S?(glGME5^> z+VuVJNbKuM_E=EIs!uz|`4Y5Oa65{dX6wM2dEi%S1U-idVkTx%uUqPE5Q6j4vEeB2 zze0P^OmA%n#^gtA=d0V{IG|J#H8OpQBG}J4&Z6yy@@R23gYa2gMTrgWkx}!k(oD}0 zVVL}W!9{MD%#FEp#DxzZ+d3(zX5M3?a1j>%IF$JX)+A2B{g?YOMh{w=3?uu+)qRvP zfjc@NK}Kxqo6=p4GmZvQ$B8Na<+)BqQ!6|YEr-WahXHLzULELhv*afO^r z!n5Lb^da`@#`SsxsWJ`pGJtjljTLe!p7;Q%NUYO7D!Xk?uZ84uOG2$SD~8zAeQn*N z?#8y@r6dI*I>}C4Z_s2nW={-YW*#}wc{~l9!MuLxiCg|@vE@HQuUiQDN-xxl+IOK3 z()pgY!(14f-!-|L1Eu+PnJ)S=GcwXf7qWQ}teS6$lw~Wsng->*1G9#Z?8)fsdnTW2 z`M_&_Zvu-CHjd6xAhq)4xob3xmFc?Z%hazO>{~FB_oCn;jk{*6e@IT7@%OB9qx(Ty zjkTsZ(@y}ws9v0IfEA)7G|0_O?SN}HSkBibG3*cOWtitmu{s!OLAA&KCoTaK%QX65 zgG)pU6aj*TII7NPI~fo9IV|V)x?)`T%u@(5QdEH;`2lq*^cish%$wN$g)=4&pauyuuZQv&Hmxjfm~~V?eT>7GvvCbo`EExZMIKn*#+$#&{NT;PH_T$SvtcWL@nM>RFH% z=ob(>anJn+cigMob6`txCiw@_$EvH$lXQ zW1BPM6=GS5)_+TY7L7Q|vXvgJd&rU@o?3E0pts)rK$KQwl$JaTQ=o?QoW5p;u9|~1 z^cE8VbHCgdT5F-Tu9b~?44#t)b$a^V%C8QCJd?%6z3nGh;N?oZ1|^iAV#xB;zj<V?5cXD*Hyz4W1>4@0=X zu4D%*TvDJ`rSf%B4(HXXCWPGj)z?H*@e}IOiClcWFG&FJq6Kl0R}%BUZi+5DSd-Xj z&s)^LB?R)*@83|fgPrB+YZu_j;Ee&&i9hn((=N2Lj&Y{pjEvJ}e?ia>$FJ$6ORg)w znLBmdMATtBgp<^$(Q(H2b3H_0&?DnLzuwsP=ZY=}%22#0!X>%pHHZ#H=;L_iPAgH2 z)PgivVW57IwtG!_V$_bP*U_;Ec}NExncWK6va1WfX>tRyc}}MtV+aGBi7i{B%K7@! zLATxWP3_haZU(n^=bdcWqK5Y8c8YS(n?@LmN0yQL5%jO^e)}|Pzp0la6jP|GfOOfZ zhNf-hwb&4YIt+TA7oXdPO+ z5kxLh54)-53@GKSNxrTHRXPTT@=dwDU^>Vg30pVp9Br?RMTOi`{p01>$tOB>FHY}pyKMn+8z6~}Upgh- zP55cQ;zEv+9_j3kaDUqu2KCo-;>(ttmP4I;y93;Z*U2 zG>;`GonLJ3)0%K7ze@+hk%s>0ODXWM#%3Q>rAINIGUexbY_zOGysW5i1}$ zsfUvSQ__3R>)fc8tsloyoHRBQswE^N98ec6Mc9N;0hTuO`|qz*DJK@gWHyAPACxvj z)f`6O2XD)rVb{*xCqpdT3jU85HJA@T0Bwi<*P@|6&a%kgfyW}?9*2C$${8lwgheJi zz2g~tW@$L)4|Y4-lozAPn5s+?KnUsGtsdwEnm#+d#mZ^+98f_R|I?KLYt-&u8wATYTV(F0s<-UMS4lwGUEhOXqR4 z+%re1r#~&2pz&xXRir=<-;7TWbY^XyAq5nC1lP!2;f1t8KwR=rG~gKcWaRoojaF|D z%`Bb~x5nOx^R}1gQ~gPZ*luH@PY>~;O`Xv8KTMdoulI_nvy^klLw>I^R(;Hqj}C#t zsslvlgs6;*9jh-ig~E2b;r)DQX~Q_sk!d>?gAV=5lqg5`DfXm4s*zc!aA-qzm4H1C zWL^iBwo6gt6bp5t$j?$W!6l@!Gf=nZ?BHi@Pbcgvsk|%FR0<*-<{L;w$HKhg9ZG4Q z@)TY^kmii}2%V9-tbvyR8s*z|^sO1Bhs&u>(nO6VbV2>w+a1A$r5_;er*s#%ut3)9 z!T$rTQ<$&S?8k*8?!p}}aEmGHJ|bL`Y4->E0k>*_9HM4mB^WpO9{5^hQUV6T6~7+j z;T6_$jB2s-&6qN;q|saY`SWe68ART!l84S^)=9&-`W~5ACw47mqb-%&Fm|MOg`OP_ z%*p%;a_6Ige!InF_H9P|XnOwq2vRw6n39z_AZlLAo>Y|W`@+mPF9_IR{~u=7Ux?9? z0tHV{@Zv>AQid|YKVAtArN93B%4ucG23e-d77aL#?hzx@PF`-!7qsn$n$)Ge{P$4^ z>{m8?Xe@AN9sWJx_hRqGN|^QRz7|w4#}+baH1iwGb?a<4jOS1If@#udvmXm9{{pGz zpTDezuBLd8NDmuBp_7qzb#((Bkv!Cvke25mfvr(gUqjME$YoSdtCWyQ>eog_TnasyQbU3e5mDhj zB8ZEzZrzQ!58lZ06&rDtC~LKrBMF;}qr{voP}+It_^{qWij2fKfl6DKBK}n8X@YGV zxL0Wmso6MXh0+Fso_xF={H$?+%>i+(hCYfRHnW{`F+Iu-EWZadt z{J<}NC{QlFBnA=#@-=(%jF5nD^I#%_hwS-OF_fkWjIjS{^t|X>W5)_=@EWdP?dP+1 z@bI>rYiDpYFD(=rD@kITSz;4+`Dt4#Yg*48!wRNGwqRsHc2oY?UZXRNsLm3K(l!YZ5Nr+oDU3gP| z#$}0bm-#4=ui|*O7pRFLz4b-qKG`I)WNq;Mg)e+e0sSK%Nh1i|sAjd#$|fE>o~Cw( zN~QSAG;vn+K|g@|=E3n-n6)_EWmxQQ0qL7)k)UKXF<8fXX*a6xv;D_Y`4ECk=R1o$ zW2Z_v#ucY`LSxwBcYrsT0ZD(0dQJ-P_h$_02Ee`4_L+LYW%p)uX1s`}jAERqKRZN+ zq`Rh7dpxjMHipxp!Yf$F#&*xx4#7lZ9BhMI&Qv^wVDdl(U!jjI?&cYCp_HM3H`MMfD>}kZYb&~Pb^}fxf8-w`rJ=L!#cVd7%#2v z&F{65wbBrp*@}~jhUt#lsNYcD?>w42v8n}5Yfc{?_o#HYv!Vp~Rs52D zVe*=hN7cb6`G?F-d=q(53%0I~4pWcg9&ovAh zUzllEJ?_z*Q7~-y0~F$2KmJ7Zy!YH&-B}OFEH%_>B$JmJKNc{V=_HhiU-q?>G>+c1 z$r^8Me02qhObAhZXbqZJunhQF*NBcrvFn_dcm9*V9-D?g7_qXDQ+T5L_uwOMyi`>k z?96wRWOPx+IDgyiTqSt*c#QR--+26bXI1ZrHWoT)`fAE$7Y)VWy<^VHy;mDg;rQbh zQ7O%meOK*7DlxpJ8KoBPFZrogz6+<4Hb5J1Yy30q?{#~;oQE}q#q}Ad`YX7!zH20XYGFL7Av$%v@7w zO2AN>INrw)@gyffo%JtoU}({FwFof!N1I+|1=DNkI4ew{*?K{;!v!rb@K3hNdX*=a zN~PGZ^;bG!WD4+6^q<6|kjyXz2FE}xm18F_HS?N3i4l1CgKNGFGpIHE4^_xaw5TjV zHNn#pXdRLsRC8kU&Lw?6Wt$AOS+bQP3ybAr-Ak*{T|_FZAW%bC=u=h~sIT_~l9ak- zN@z}1cTe*7B)vmrF;l_}0UvHW{xaA`+k!+3j?FRzO!krx+{KDLKR%Hn7*-eMq38bg zXvD0>1)BWw%vXiisyM>Q_>s!x3+IRiEbNX4=>PVX7vCdDgU02RSnbjaLxZb;CUn@JH%NT?-tg zjE9?uzUd||RY#wUO6ooP=2m24EIT>AvTp3c!DUTY9T>)r+KTwH z{VT((XZvPdOFK0I=*wxvaY6YdD`XMncwdEe^_ z!L3_Gt&Boam)?yv05I(0j8>Qx`a-EWDqaM}^7Z(!pcjI=4r=Q}MchquR&^@^h3A?5 zZ#w0PQSA;PD*GePBuj;jU|!$vE-qaf?-LyWgTHvA}mbzR81u64ir zGVn%+y{|VjZ^nFW-!$m)LZz2LLyOZ3ou^?Q52fcz*4OS!YLv`PyCBR(eafE8|q1kF6^5N-VDpcH7pBg;ImNK>+{WADsie74@+@Kut$1|lB;j8KE9_e07va_p+9iB~qxxZ~V(Ut$oH+pz_ z%i-#a+}2nT-=?r}31ia_D(wi2)h{YH!lHbpaTEEqow7ePm~CV@wm=PJp}L@c-j^FO zovFuW1`{?*v1E%8E(f`ou5q-gzqb(eR8>MvmYRNc>v}rKuXBLNy0HiB@@tshra>!D zYKzce0nfBQK~Od@foID^w19{__Lp-bXSYb-Psp~c3v8be^W>T zQIKeM;+{{6wdOB!Z@b?#?6MYH(0}$=!8Tl2;iHzPESNUD@YTZJ>^C^aFRTxIK?8XRWnrsa} z_TRq*6lXrK2~T`;FyQswH}z$%f_r4NNVjBRW`RT2wpEy1vUH9B9^Y7QNkKW*Lb7DX zW0izud|i7XYhumR{OPjI@l6}$6hb!!^{3@clsmFbQ%AmcT9rSwJqTQW?_|qRVC|NT zQ-6?7Fw#aPD*l9p{opV4H0hxy46|7_)od*@;2a9xD2+TkNS>K;1sBM;%sf$R)I3^6 za;jFmXuo0<5~-)Rh5N_rvX4g)nnxEx;dCX<0uv5d8yfuMmu1YsV{Wm^@ZK;OY>Fju; z5{q2lp-9#5^qt$H>oXfnx}5OdealmzZn?p=g0kJc{O4e-6Oz{o4>8ve+tZI8siA%Y zGc78b5>*WN%ShelKXYr@p^sWWBg#B4@H1!2R2OF4?I##bSUXg#st`E*b#pJoK!CqG zg2_A;u#6QZYgQzF_=*TDFeaHuX-H5^mj&2MYQfo|8IBiJmkjDEnTb-#(PUtw;a9;9 ziVy_n^vo2dN+U)+AQDK)-6_KLV*?2R-ID{nQ=cLTB+@`5=59~oFy6<92I18@O)IE5 zXE<8~BAWN!sBl4=hnRildiJ&Iy|(u5V6(k1@d4Lb96TDXtIusp`6_h~~>?BHDSwu#O0uk4FCzB#_OlGxV*zV@zr#N43EGd``s zjIaBJlrjK{0W&ksl-3VP(R33S854)vj=oA{I2p9sWt3rx&Ybe>vaTx#YC zoowx@{Y#K*K3KShRV}MuX(65We8MFxgDCn`Zgyn+@-vR z!|Y#_)g65eqd3?v6}zXysEsoqp6(l-I-K?wK<1I&zO0;yN40YZkG4+*l6>D)_~eHe z+1v(#D{UV=xx3YH`6jjyBvuH_f9XoPeOLcXFOgL>ts$})D!~3yK|ID@8f{xJZ{so` zWF9(E#zFCnu%W~Q2%VdXI2sE=R2VtengG=W@7P6ey9(B1_Z+cb3ng46>NrcpT|Epe zpDT{UXO6HkC%3t^r5T$^12+dCo^0pI;jTAlIcu)K3vWO6$+3f{KaWUmnGU>yXE;@%k`m|FENj5Zgz{1*1+ouO zr_|KuF^U&_zmP0-|D~axi$o#^cnnNpP!C2pf-5ND{AWyvy%6y9ZyzS$mgu6>c%tA? zw4wdcD*}^r+t9m*fC{85cuVg{{Os18?YNSOgW>D;3vq~se-_%zFQi5=gurNgEENZy z7vV-Pt^_X1$*PMr*QTM@sUg~rp>p(i3ca#5FyrAX^p~&IRT!H$-*Z-d!k;r0DtxT} z{ZmgdxubceHNxpdY!_XKR1Rf#;!}HT+3dYYjO&wEb}kNdk5s51pT}_GOdij6UiLjA7 zqdjs(mpGq%G7FsS-@w8Ci%riu_CWCkV8OMW&Z9eR?nJO2=g$H$jt0NZcw*|l#nSh> zvV#Q76{}ao3Wt*D99~>$hC^o%_OF5dc^X9N%(c3S>t3(rB3vFg*254+yVhV~-T&Tn z-&c86B*c8BX0~$q;|&|RNebZ#W*A~z+|Vhf z5O%W}?Q%0N}I)jf5@ORk+r#`E`P)M~cnfogi!V{?7V@5|jyBDgx+e z1{*_adtB=$_^h;nIoUwvbp(j|;}XjH%sYl+tg=B?7qx#s@}RpoVtFIV20gn0i|^iS z7ln)@@Je9BO_9nHTA~n(If=tVQQDw5gK^*??o%6xrNgTIeAS)>`f%w@-$Y+EWj6ev z+hz)NMNc?8T_BR%&KE#9Fwt$+xww}u+-559nC-n+vsRvD8r`gTnqQgdUC}vuGHuEA z6WQxc5s`K!o>t6AlDa*ed+w$6_N*4HDrum#OIyfzX9vkDFrF<}wC)rU#B62Xes6{? z65Qi1D0BRcSFQ6pU!;C(D&kjg;hR8#S|GvD;3tkAWJA|>B(FIC_6_&gzYs@b8HCc@ zBwFOadX>rRI$|9_H;Q{Cy-6 zs!j{-w2`*DZBQqoNYDb|b5kWs2b1Uo-DFnxA8dx+74KC0hW#KB z*JxE5+qGO^F@l^*lEY*$=;ysc2tr=OL#wcR6RZkGdSIsEo8=QWlca6@2Xn#NA>zv` zz6#+~=UUMcRZPwVgc?&}rq1x22GAN!iEFrNw3)KIArXHO()@q*%cNcw8$`InZ<65+ zp~51${!P5F{Cw>!bO6O?{%MQgj-I^7=OD;HB^67&!Q!&p9qTqC1znado+jiAGkG0+ zR{g$-CARM4(xB7>4zgQ0uwmQEbE$P0@RfYFdBp7+29p)=XGvEz3qtE@Ipt5a5Ex5w zZ2vEId~y8?1wP>JWmZ0^B~*fk_u{LJ?hDLV-JI}8q_>MYLcRS=%Gr|AYT+O(ahnGv zOVRZrB`Y&XsFYW)dKWgst{hLei!i++K?vN^jJOWoxJzcm7lwmM>EYA-sdB)WalPz<19Ei2Ge>Wy%xg|xN1!+>|_<|iPHGIW;lir@R4tvdBPs$ z&aW^8TlzItAncR|``^DD#fU~C$w4I*sGz9uL3?BJ*dNQdntc*5#bT}VVkQ-yUopmP zA7eA(X{RIZ_QYZGdy*`4JFfW!2o1Hwv8BEs<+5|37=@~+`^hAVhR6{a!o|Om|$T6 z;d)Z|!fFboYh}Y$t3l0tcW*VW8`Sx7ZZsJ|T4G^Pzp(HDJIKhI6uO&PhM zv+>CMMK{4j9p*vsRA@a43lQY56@n^pBT!dAK5-RHtor5IbuNR2R+?NZA8UK(>Nu`)`nJC=pju{VTCKE=#*EQ_S+~4t6HGaqS~j{9 zk}QsbQwbR#T?hQ3!ILMa^x>_7_ee(vxpbQM1f>_Fi0oBq2~o)?0rdrJaCT3#a!`j8 zZQW)z0VbmW#SM7l%H&C}L}Z%m(k|~{RA}^|UR!`JH6E-jiCagNVUUmsU5T(VKlldL8%ef|4D^+%jRaN70dFZR-mKliyBuH z2=MWkeXFMWB(u%?v)N6mg12gWN8Z4>7AyUkqzdzDJr`x>hYz4JjyWvrN%A|yOxsEy zuTXlnjr-10nQ*vi5)Kfm-#;vem&!bQV`6eK!U2Nm0S~43&TB+UHMfWAvO1E|B#;oK z+G;joRMNazLlDZ6F96sVl}AS++)8=po*9Eg`w-13p;BAh|M8+<<>mVGlV+o9GzFEy z2*`l){Kc~crW7jneO>Qns}x>9b3LYkY+tfYdpX`eez7_c)0DD&AWjKF<<^kg>S@py z+FrJeGatgCIaJJV34Gj@_dV3)+h08XbNKCv4B2G$FpPCBP^AuqKN*u`0?U3{#EDg_ zD6CYqKrkK2lFD@n0os}YUf1!R;hcl~Yjj}nZ6aLuL`Ve@j-}4f`Xia{w9|9fF8q}9 zmaqK}JB7R%S@poYn-U=#DgGd*(!n`%|6D#m2M*nmCP}%EtXKbXN8yMCR!FvUknRjey>e4^*6)2~3!TpPLCc$Ji<;p#cpe{h&bzOz5@3gMd#t#aP(#`23xpZOW;iuEG$2G|`?cJsc5@Q|%9 z5Dcsxo=@0uhVBwvC?TS#bCJx*ZlBypNJY5~i9#l%@&K7slJ|MVi))`b9SG>O1X-PfSjm!W1K`hf}^s3cCdwN&8Ix%7Qh;>H~ z)yn(hm(uL4yM`NfmK2&ZG01BSmN6$Nj@g8aEm)vla-vH;3{~txB4+C9T?V9ck7oL}NZ^CUC&Yp-Zb)?f@ddqe^f1dqJXMR<&|` z8<;((U`?=Pjgj8Sw4o}_xB5m18OQm=^nwY)ZUt*%58tHZ8bsjONHZu}u8vd>Q*XHp<^E5i3u%Vfi z#i7hT<6Xr6*kGeeD_f;?XTZrrTER04wy22hQ_hN67C=}?xpK$VUXB9_a`dKM z&9+x0-t-AlJo1cr%S*j@Ho48RlCs)UqYBICTV`6Uo@q$-9_*9lRgFoLpgZB(Yp3RUM+3lYxAlGdNk%&piW+rn73_d)UY!^_S@6INem~Jg;=HJ5_21jT@iC z)MyuIe1H_iRgLyxxX$Gu*de69h(jPxcnYfYwP7!u%HP#E@iM8lncvU*BrJN*G3S}E z{RNp%5(JKAL+K?k0NCGIvP{NS&RIkIJNE2+RCCN}S)nW0<4q#JPV%-LgH32pO($dDq#Sxvt7IYA;|>@t)RS7kmi}W-`xP> z4@&`sy_sMerEsY=@#vi@8bj}#s59bPZohuO!^qYST2W5{>6OtL@V_X)gf+oZLS28L zXf}s&6kP!VL2|N0;{=gCi^(L3`L2Rc7UUh+513c^42s(k$_75`uJUCsDi8%Jx9a-TN)D(6zpNK z0RtUK{)LUJ6&k^zaXPE$ILJYvfgdI%Hh6AjGTx#v<`J8-EwEphIdCeS(x4)J!oYEb z!I*DGzq8dTGb$2EpRC{2sb)B1YR4*H+A_nCRG0W9b@z?Nw)L$PI8W73l6Ux(IrCy{NV&(`R zX0H)33zexFx#BdMNQ0~&Trq(T`$yUW^M=d3f%@`Ch5e8^ zaS_it)UlWg#jNb`Q_i1p-8+8Hp}b}0DfbHIuU)aA1A9!)&F|gzfOQkudnNAW=6~3q zlun&dSCryzJO?FX38PH#JH!4=9ex8X>6jtYj3b9WDKZ-mpJm?QXicvQQE^}I*~Nf4~2 zZt1uk#z=eM&m?a1cL*hwFtcYA)z9S{z>eWcljEI5vFTjiF_}X1Ji@%jmN(MQeq|-S)xIWIK!8?0K)gfd9`nxD>`8i&Bz3^NSD@_KZxBg45V#X ze3%B2^TXEpCvGws0@RX64e5vk+js%pO6>Xw27m12(G*7Hi-wlRCM{6j{CY$}>-&7@ zBQbZp=A^&y_ZZ__aX-anh!|PVQsZ_`TH+*$qz&25omVOhjT zUo6+;m9fVRdzv>s!fA5v&9B@Jb_|?bWn26uUV{`x+^7Y;AaeBAX@1XpK@TAND|L>F zrnM{hSEb=a4QyTuNcfHNKE48_37jM)Jz7Lsj@0&*S%B+4)Bq}UOt|9Fz@qPM?JV18 zai`as7Q#cmigkca)WIhWC20uhhgzy^SqClOt^{YMldRYHOY%87;>#*QSNJhkcCOxZ zTo32UmP44&@+9zGZR(K0 zedOkb1-A=fF?q36?11Sy)U8dQh5T{WYDx?FizBabDy2MST2)uNSRuI$43v~pwH;u@ z;iBZzQn;9;241Zox<}bz=^#_k_3&oStIP*}bb7zUw#*BpSU6QY5G@EjSc*@wq6-@3 zeeh?Y?^RHuw1luXMGgz(Skr9PXox8kr0x2|B)r@LS+Z!E)0r6)5nMQ_obof@AIEJ` zz{+~)HZ=r7S0-}Oz<`QysoS$7Q$Q|vJ}aM+7aVU>^lX$4n=}1u8f1fYfzZJgk6{F6 zjlTwJ5_0rE>+PZ`_fDsQ2%2{c&nhoJbbu!aB)}jO8v6phBMkgo%-i?#NRT|g#yMh8 z5-n_w?#i^#y1{z{s$11vPfst_F%Tw&=_-2z{OhD*{TGbD~&P!3=>i z8eRSv{eZJrXhCI@U_wN?oaE9{&%0u7P;hW*$?YWxT5Or_ZySLn!ucScx({A5YuYqBZk%ROSwnPUrop--8SFeOC^>bi$U5asY1o|2CTDA-&n^k?|D9A4u znHCg_TUxOmPtRtiUJ4fEpit#`8xvaY*wC1juW!Z?u=REJpx-_+ucx}XzOhAkJN)7B zL+_Ck`qDnmUd&!fz^d2qc`Zzh_H9GLH>uesq4w8%bLx^O`w9yGM2j}f8gJnAGY!J4 zChX||TLRycUBt5z5_hboyUycZ0)l#$lbzC3O%_-u>FjHh*Fcc7 zm%_vltkX_}4d>_E6#bqSL;&I|@j_$0>!c?A6;j;FUm}2OL@V$tHZPG*RCypvcHuC( zMbibD8dn=4K{4-|@8q?8b5Qplic3oz0TZlV+C#ax5@b+55s>GvA6@}Dl?`C&j@DYK zbW(3*G!v3QCf29m(LnCGHktYnxM9=E9O$XsamQJMKr~OFPu{G=K4m$iKFK`J{{9uz z_Tip(sw+zJwT*^ZMZ$lCyUbA|u+G$AUiiOhCr$-fYL^4@`|o#aeC~itNwOLeow|aq z1I>8+snNNqj83yPs7cl$94l@@{5xM-2TLA_DOV&)ZAJt;KQS94S%Z`)VUHJ-*<31s z;5sd}&SR`BV$@!dro+E`8+x&8Io@F(Rt+CT@|T5;Xn$nF!l8=wVJi^Xeyqhf`!^2pW8CePL>)53@TP zZm|NA5C~O|t-GfwrX`_fnc^y?0*CVn8Zv0KR99=H{?lUoxs>i!u;)I0R8b2H5D%TP zf~rZ=$PVf(XDNrPOEsRnU%C=t_+1++T>2GeH?|J7?g1rZ4x*1|G3w z+!!kngx94w`u`Xf6?Kh9NM9*9$V1LrOUC~SvB8%+gaH#=L)zn35^D6Vk#94Q+PZ|`^0Sx*yz;b* zj7y?vWQY?M%nx+o!i47IxwECt9oYY}LzhK18!J;-$h82k96>#{yV6I9fu_3<_|Jxk zSc-mbshJ3H`|@S1ymW;EC&k|9t|WSH`u$WK%^eN%?6R8uH;PIvU0SP)^KQ|iLl#p_ zM1n)HNfe#m+tm*>nz_}gTMMZyRKm-$QOt9gM}MXtLdh+(pW2B2O1Yxh-${3mGF+vF zp=cbH!^5nm>De$Ke&7y55C*Wh^*{ZZQjo7eAV+YcMbQXzF^mF-X!IAkdVr!p{Zeh!ceSwjl51#fQRDDE59|XU(Yy!Gt z_cwba^cH>`{t3oiuCp=R!y@4Ahwr%C(vH)vpViFOr6=M%qYCOpXy0cR_|YNxu^?%w zK4na!IejsO9J?X347q-ooj>K}zWE9TzrbCtlG{)aBI$2cZE|hj{>V{Qg!FQo4*l9D zznw?iMlG4_gz&{{2sKI4E0uNOxE?GJ)Nl8J6_vhEVK{Z2kZCJ8ANh}i+9xgKFVVA= z?V~p%%~$CvM#w|C0Jv%m6Veui)VObm)%Q?iP+K&gp*Xv`lGPe=D}n4p1sH*<*9=`e zb^rXj*OW`PKL)J!EhG>c6WxS@>`df>k*p@OC#Q~rV&^OI*buLT`6fjL9k3tMEa;D0e!Q)ID@#2gromyj;OocFz9TkvM*cuZnjK_gX%kDdE)di5hk=qsEAq zR(`7`+4rSikD0A#2aI}$DT^OTW>gA?ciRk{X1@#t@{73tg*>@kocb!OuV|f8-hxxT zc0v;98TL1vw*Je_*l`{dV%;$Dn6m}ita$gIV+?(a$YxSK72w&(Ap*~}xe1%rK*Umh zo(&eu=)VZ$i_BQw7Y7)t(V~knHm=E{%$W=@ia`6lAUqbI5!ekYHKWP4?JT?9IDz5& zRU!u!&MErDA&8zOQ3u#@m9(cU+CE#Kzea-XVQR)vWCNZ?n;aJzT>~UZ7KAU%dzC{3iCWrxAbP5ucC5OVH(ZFdoluNWZmPC#E(4kQ1HN zilgB+3Kd;|00h5-AU2`wgzD(f!N5Y*zGhz1Oqsm>DM}nk@$vdRCyxTh7Pt)` zZ?+#P8$6;_|JJI=O>qf+17#KjTrl(1ootvVEf8G^k_T%j{EAVUP_01Nma@VIRZ_x> z^}sl8B*$3H*Sr3N6&&2AY77otcR_cGvpthaN&&gFkHo2mE4{ zKNKcM3Mfguu~Eg!>#7t=Ib!C@i)Hc;L1XOQ`q$EqYO_q@g2td`>}lvIerXJ)wR!Is|paJ*abSIV66gzI-?0-+==^N-|_5k8)ZjLRV6g#gV}+6lqv zkL#*$$uyA0{)X8#j&!Gvv(M;=}~*)Dx8cy>NmnHA0xco-oYDd3GHz)q0*L# z)Q~8=^Zsn{Uc)d(4zGP60{eoZGE z)PjICCvW+&65y$J-?7!24-%e7V)@%WcdG$FD=;BN{8zNRcug<`ryc`q13H1-X>h6g z+oR79{MRe6#>}$2_QgP-X+RC%1jrZ4jmb&oAQw|7<8|Np#wAuNEG1nBVP9ht6gca{ zz5att9BWh*R)X-lG%aX~6t}kpa=A4OMqqq_DFUfHw7z~-yLaS>uuo9_7r61jOcMSn zg@#RM|5~E1>93tZs&QQY4xNbL0Sk$)f=bM2aoSVui(g8#KMefW%0SRXZ=EyJ(tOxv z)S~l2<^W8Q66?%_RoZ(T!EqQhg5j!VOquWbTgwnVMH1-=-QiNUyDU&(E*+RGS4yj< z*`#XS(-41#l_-1|%8xzP^QzaIh$!D&1 z47u|ix?QvofAafgHIGh^!8OMB;zmDvuc(Vv*~Q#FHoCv-Iw73=vClbxbFD((c#Ye< zmZ`X#0V-iJM2aTuP*x{fOAqMjyL1~Z$gxT`KbBNfH~?p% zpc?Z1`wroNtb$e;v>r4?k%2~JQX^2Q&k`kuubK5l=24WxG3`aBQZZ*}bQQ*D3STp> z9&Yy^A=iZ3s+ETvwBKxgTWbxRhqhD^8^F6=1vZ3;AKfd*U9ElL732tBt2Wjp!#xp( z3tYW@iw0eO;$_in^zrx~L#RDv7>IT1oy{FM*(Pm2bi01iN{o>!UrKQsAVmvUZ_agl z0t2Xs#A_x!iTOVUnSsTvfj|sCfub!&o*K^#?Wl4YMar7*m{YMz2PJ~^cNkX>DFC&%*WMJyQ7+jK%*ZM-#4t?NS7{uIQNwxR`!|R=4k`$1LaZZ(| zX8L2Kz9J<*=j{0sYEvXd(FT#KWN>PL@{0<5Mi)O~Qr*+@rGM}0+@8#Fg|--euhu0G z=nrh-nE=F3_UPKUy`w`fd&HeOwk}Nz(0nzVYQ8+L|IcBu%I84_V#)a%!`)2=*B+I} zo3MnUmQ^QdKoQA$+&XZc-P#tbjQy55r5u8*LFVN>xGz(dmy-A4Kc!^n23108YsNXv zSQF#$2&ZEZTUEslN!?C@+d`ieaAL@0P~BspFEWNPyL4(QK5wZv$iEP}O#KiB7M4Y7 zjG)<4a7_G#_)sqOua?2RGKhSrYf4?3eL8i$a30t z@6+iIfjnCJ`ruh@ABS7bYd8%{x->G|lq!V(or|^+8~{X)$gmVQ5%w{qJ;S^k^xDQP^qs zf@c{r)$DN#eR}t|p7KsD)mQ)YQN&9Jr3G@ zll2x{V3xBY*RTDFopo20%0LZE929WFR3eo6do=r1n}rAin8wXbK>eHz)=y7L9Ih2mb~9zXb>g00aR3PyN4*|BnAh z=QjZW4S)myu@nJ-epLWaKmagM(Eql&08}7BK}ku)|GECR0Qmn3fd79%@@&(AKF6zy z$>XkyxKP3zAGes!PN;R>e8w-5Keza&IKc%p0u3F{JvQNY~&v0dri>$OR5ZlvwN$u zxbZEbsV6UCX!C`W+LQp1aO7EfaFmfn2jmnF=nM#s52LLT`(vVVHVG9{B16<`*@C*r z9#D37qpgu3Cd4O3IgIvXQHhphS67&3_ZMj9UpR6^_4guSuxZ#YcN>ZqzNmB2!#HL6 zKyn)Vc#smaiqs`PqT$=J&dmy)c{T02m*LT#! z-?x2J$rMVmNCn0jKVcqihzp=0IdAsX1pbK6$|pBnFt3+KW?t7B1*&SMdwCRH|NpLH z5K|%+6#-J>MQf+G(Txyn_V?W4=Nv+utQ1;CK7r1(V@!AaxETa!G1ni}DP;fv}~nj+X%^=C>-aRtNOz zar-4lkGTW)+|Qp>ZsGQxg)re&rY+0;UJd)^v30w#b=$FBuYfWfo129~N|CemYcP9O z85#yIkljGBj%D=X86(!w={9kOtcHx@;+yrn(5I?iJnuQ8PKE{1kqAH6TSRBY^svBK zf2s4KNDb0cY-7kPNyHM!5*3!POevafu>v=su5`3stCPi9p5kr}ccV+BDVf0_;m8la zRn&d%%ZY!qS~-FhWc!t!T4i?mFsJk!APf)3d;}A>!;Tf3SZmYNQ?Tz7=TosVH$TBB zNrURDmyk)YuA_e7jtDk(GxcCx=aApcqro{w&tof!m%x~wu57Iasah|8j5o!ZmGJzv z8sp3%mT|@Ml>Gl=mCgFiE32FE@7FwH%%HCne$m5%=_q!#gJ0iEDt86Xz3|nU&VbG~ zTh^UKq3&_C*a;9z`Fy4dPb7Xo=XkOfdsMURlU)9Jyli9E|BXO6cN5YIgD4H0PnMo5 zQgan3y|gy^Ar}v{sDV64*Pjr;0M`szmv9iKhd~5pC(SEE^g9VxO3y|zx6Qr?FaaY- zO-~4(0F~N+o}aJy%BRs-K!F4jY?RIZ1lLPdP#mtJ$%MAt&&2YPq07%159ZBx2YPTv zJW}vajx-u3z@Ih9%gu1GSHkaka7h{_P(jj*FPR@E=80CP5ON(U?C;=hSFCr9He09wxcppW&85x)lJX&ZF z;5|T$7}st(p1@jw2brmo_c(1hKYpj7`gL2YcQ!y-5f5b7TD{hdA>c=I=~P}WEi%%0 z=;Hu$pPSxUbAqpjR!AigobaxQ7Z*^6Vlo#7bPwJF-8QY+@UQ?ih%j{J$uVT{LA@?;i*Cc9(*5{nU4Q}A>n zR6%qDVk}El-xSn8A!WB*h7fUPqbyxxzSVQ8X-Q#w(;At6`t^okRJ_DjtYcoO6{r90 zNfaSor2nlp0OO}0nvzEg!}S9SH342`&u?jZ?eoER=EPrglhwv5aFQukYFujMO8pbR<7k%hW7+LxnrNUKT%oS^ZqxLO}fZd2{x0~)O z1i-C2l_a3c%3Tsf^09zd%@?(UaNCCI0N`qI>TJ#gL=+=d>PWG<%K}V7`%|+j02hL6 zs1mRDr!{qg>gi9JRVSEoKKuc&$Cok|m>0%Dh$ZPSk347wXwkG@pHP1AYn_K+EE}ZP zRcQO)y*tt{Q>ma_ehW8~SrYh`k+>|;x(S-_6!doOPw5LUgo!6=_ZZ*h(6N8o3WnXx zvq1LP(B6NyGCtp*rlS8vJ2BSuVVy}_h7{$9H#*K>Vs^8Z$1XFV`aoX(kw2Cq-Dk(( zH&H0DWV0{5*RIjG-Gt;wu;s=ZA-HLB*kYF9KKf;$0P`f|ld4T2Y@vcOMA}?Uv)wR| zIutv*AwbsSrI98+Jpad5pmH)%uHSilJlofW_4*3Of72&8X{mjkUBICq5Tbdm4h`B; zQtl`ND&t=xj(aZ#F}48y4v}&B75|0wY8_p3ofx?m5DzB8)|zEoSTPOF0Bxn;;`YWC zWf{Vd6SzX`n^+p>77CMqKzj9Oae~z7XiNW*jHoAN3m(`v1l8gf;tz90k4Lsg z4XKDldu~1~)oX8m4ijO~BV9ubTyc{5 zJ$@5MvG0sJrDA3A>TfOwV;&8dwdhe5jEt-esoGAWP6y8thtq$3n__8n^VH zUR8wx7Cfq0NRRVd#%-DOc1>Dtz-w+IZeKkf}#*o~~&Xo%P`Tx~P!N!!VV zPXOM%vS>))(`#@iYe+OTh4mw0wb*i)JeDBM`a`GJavdGDElP8ZvEapYrVn5zvHg{{ z$pfw3|5E(#FhMoU@~AA!fMrBt$3~!oakycD4IfMR?qXgU;r|y>{FkS$IBbzXQU=uBkW;O9_#VjU96#qhzm*J1N zNJxl82>~ZaVts3zluOOedP{c8b_VwQ`GOpu=(}26><+QQLK*?~?h4K(6pH z$ow_jUpG^ylfQ(coEJVix8s>Qb@IIXg`4u|$V3pU{ZUS#EP#3FVP}qnw6h3Y(uPZ7 zk@0LzX76>HeaWFiyT6_;*$!gv4c6PnjW=CfSY34V!p zE?o60k_Qdlu_Sg2mO+w+kgRSxnUCyHsvmNt@xW~i3)XZs(ZH8ssE2BX>y;cq(5V^S zbL&<$Tfuja&q~B!%4NDM6`KN(AVywiq^!W(^McZ}e?lxZT#B`a*28!=tduAnP?V$@ zP(f({g3XUUQxSVPFs-s;uYUAig24pc8U%MRwzZChO`E{l;h5%x`1l+%Sa}{44&8J8q^=)L) z9|Bf+CBSY;E7U(lS0niGoUBg6uo(j>7~X<*qDnG2zhXCLpN48&_BqI#Uz~s~T!Zbm znIn-0`liEC>>|o;rGCiGuRSEW6c-v!U;qM0+BAXF^p>I`CIQ4A7h5r)1F+ zbXEn^|CJUXl=*ef0=k{@f}2RI{C9{F9}G%}i-6Hd@<8^#>~x9DldyQMvL~zc^{R!% z>dJ>;1E7k+jm(j?DVd-YZiaG=S^8vN#IzSF^kwXPi!l8p#hrZH{{=%pyua1qatQGu z!e!<+dmm5`>cj|bPU4~vQxMEBZ^=umk?V5lZcKRDa!lPwRTsloy*=lN(I z1{q#lDTUw-u2vg5ZzbfD1Z?8fBC{Zo${s(E{4{NRD4;M!V0kJYOnMI2vioQrBz8md zPGsvrkT8tZm#eJCjn}Cab)&VER=h4Guflx3?Wt)is+`76gcSW-VWyre;jDhK`*6Po zX$XCcrk6g81~7S9{%m;-(@gg~`Z#Jp^T9cA>!4dX$Ndi^aBB-nEuM=hx0vZGZn*7*@!=-$L)c zsbgPb%azrz(SL&xm=FnPi8b=D7ytuTCDHPJFM z7`CKyQ`MYm^+G;(0oi6U_OKLHycQ;ysn^m}C&M0JdgHiE&7S$Gv3l*(0E;O&ChE&p zzn)ZUJu0!zbz@z(iQTwlo&RxKD~rFU9G3q~k>+*CH}R)X`pFjX<9e`KvZYg-c6N#E zbYn?P=>-liGVAvo(8;BS-CSD8bA0pP^UPlGed~g%P9&(O18W;RIDZH_OYx2a!@o0A z;}WBmi@RX8PyDlb zj~!9sO;VfPeaS=0lgQCMF)P=_({U=h?+Ez;mcLAKs$?Cl0`{H)|25(ybxT{w)c}oI zn`lgfhR=n}NQ`fdO(=B)q(PJ{N1_xSp^8AcmTfBRixKwSs(Wt-kAWOJ%A%1YKETF$ zHKLt$0!(XV0TmGI6QtGP+Z6W;y$N&2AYGH2GMn%_P2RK$12Vp`6>8szkN2K4Hx-}^ zqnn%8I3(aigA`_MDp(P=$Kg!@hq{uY>F3xjsB3{@Ps$w4VuFz7u$dx|A7oi|I8Ur6 z|9d(zM|y+WoQ)aNkq}LLi;9y%@Uh<}h#ZiE3O@qBCq-=&#zma9Ittja=PGHUF9!#K z(sW!TAcjGdQsS?1(@v4uXzM?GnmW+2W8l59o#O6p6eI;jx zaNUw;&kIX#ceufUol{TXdV+KQBPM!+`|^uD!%Sg*e(i}Ec3?e7!Z#F z79ztI0AV7N%^aV>m=NlNPRW->uUCkR4L9Em;cnr92y61BNW{ z`a4GQ4jdkiAn@>-8@9)=!oe};ogv~m=e_K)Z^_7QujS7LNP=U>|78&sHWOL&ka9cT zQ8}y7$j-qX2rMbAYOoc;orabXtHB2Pjts9BYqny2FwKfWBSzrf-$1WXl0wH(81hj< z;u?F!=r7ty+>k3`KY6wlhJ;gEG~R;dUKAJ`!%$djdZ`kD0JD4P_`+0hd6co^&}aNy z!SQwy4~Nl+J}#?()qoMz=8r^w;Vv-9Bn&BP^UxY#h1)=eP7bB7c?OB?=~o8T@GM?y z%gDB&m>C?i)U8^FS;6ZFgSR>mvDRM3vkqll51cnEB(z52tC}?Y3)Cu?HIi7aeX9g0 zm-a~z)rppNsD>ffu_b%$SO#jBk{EXWZBRC|v$P_xZ0#zhW#JtXu>p>t1s zo)J*&@owGEGfNv#6n*-(TE};gZZ<`72j{iSy>OBi>~wcU&vcXH$z{CzfXmwBnWfoc zg{Pa`-x1e3#J=OA=ka#mPEz7(XRD>03?o8^cq}PgT<2Ot}CZ!ZM z$uAV`isYxRGU74I1N4 z(|gwLFWQsg8`y;9_y$tfM89g90(yzOu13cu4hx>Y*Eo*a8^7^tOss$5i8Z8$6{40} zJv?w?Kk$kZh9_7Sh!ydE>qdU^ zD&OHfrPlHI>F_h`=Y>_p@6k*Bck#$XgT)_8M$b4wbaIiGD0%TEMkL9 zUYEX_U^$755x=#D-Cob9kdID>C20+qM3S~cYirO@Wt?DmFqFHD`7>A3M#88r!3@?f zV{UpVvH@1^+HWY(akk)<2_v`Xiv#jPDOv%U(wWX3g8|6jch(y|zp4&>e^2o9F$d$e zSvqp@tvcyJ-NZ^ZCf!@xsmmujk5#!L6JOAl;Yc6ihCSRKSg{ z6p1~_iI#LKD)}^DoTBu8sSEcMp;#!(IP%S&r*t{kN7fquU;43+M7pSJVSh<&YwPzC zw9#=zezCa2vvF7yfBPpGB-P$)7dE8_+w9qo%=Kttrcc_&Xh5a)-5!*6q)2-pkD6-#37Xa~Eo=seXuAju zg<8C$FAOw3&0jC^Wu;$c%>g^Chf2i#pAm%pQEJ1QKD%(qyiu$6mJGJj3r*KPzZJv}C=mQcyEVSHO(2)ouSk%Gul2@K2-trOA`j;fUJavfmRFW< zYWY)c{ZyHw=LjD5QWqa}#Cqj>_=O;_D2-K{^gSlP*`Bzk`^vx&LM^2fVQ#V3)46Hf%F&5Bg2 zc~>wOn)d}=%^P}C*h*C*WmkHD+Orqx4)bxWTIqXJ}fw4xuIdru=`<>@)P@>Ej)Z0@oWH1ta8^&&im#vO|rGDN}7#m{rkGK<0Yxnk^P;6>X2TT*U)N!fmZRH|YY zBC0A$3#x?~{Bi9{L=WrSE|Q&_$=#v(zzy-Vwa^W3Y!f02#M+BBh z9`^-sO3~eLWwO^^4=uM@9B%y*n2d^vS@xdXXz-K^)l7esxWchx*~yZfIp-!95aX+K z+H3mQlMTZaoN{z10Z(D8biKIQ%#`5`!BpVmn|k-@@Fwzn6fZQJk~%+eQ=H~W8j%OIlZnnU?*D8cuf2fhOqzPkPdPnf<$e}u378G#Yg z&}-v7lyoHxp_P6vRH zlc3S-=}8nZDz6v(1f=mUo5^T>b!F&x(@V4Lxb35zJ)%sj?+}QJ0+?Lu;1hVBIYGF zbct*0ZnpSrwhHduRKH1FDy#g4tX!cZG3c>-oR2j+h>#-(vK%| zKxARmuMil4b~VuDtokx(da}67fAJ}#myFX;78=FKef+uSqb0>1GApZ=%o~4pB=W0J zdO;QxA8F*{Gm`4Awrd#~#)Fphi=d|{&?&Jol)6MEx|saCW`eK^`&T8 zpDoR7jx-3wcFgs9ZchhdR4#W24dph%6ULONn=G=LW zh4da;CV4@8o!Hw(P#0i+J@+D6LJKB?)#V98o|P42S?NxtN4%`&>O&XN3zWR=pKX$& z3hayh3$?aXkK801$jrtFu4HkV^q#D!O+W;NoHn6joIHoL>?Tjigo$rs^FT5D26)H}O@{FY>)t^regauov((WMApU;jPd_0^%j1*acw zluy6Dw8{T!YZgBjckIRnaq%+Z5QO85kC#p+h%}N+=48yqR;$NjLtvPFb+Yz^o)F%# zE(p>tm{{=hk2J5RXNll3K9}R^^;Cg&@8`1yWB*^cKaT|$8;&PvH+-{0HZf|8m0X}K z+jw4DurJpPLeKa4Nh?e*FWeO+*h^WcYM&q(Mt8*3e6WGFJIay^fSOHDee}jHY4>OYa``Dx`Dyz2naJvB7uSMNcxfL?XS8(hnUg-3=%!b z8)(E?|52&1lAiY#5SaKI$%(FPSz?kM?(HZNJI#E^Gkbfr64u{{%NSdKuo(>Su=TF`GrPTD^^$WMf^nB3}XtBPxM4 z7Eoq{gh6J}W!FppKY{Kdg`)x?w!;KL?>_++68Ionz`05w3)b83$;_=K>Z8S}jGu(r z-1KHxX2>-$@;dPE>w$HcQlX|7$YGsUmcvm>GiK7=q10n@T{Iw)kzk>7`Tj1KX&a9t zF?%FbXzqAa2xl+GcUHi{<_3-YSErfKh56o5pQ)DPwZc&WYRbNFIvcs{i+Jy{Ck5ql?WxxtJh7_Yj4yPfUGa8G6@1@8@hPNX=k+H3SFC_QCyFXI|Nt( z`UzlmCX- z_w95;OVQYy!*^O;h%I)|95AG-DOf-q`kRBc&Z+UYN$I)fRw0=DokkO@3HstqCVWy< zy>BaH9@x0Y4Hi3iUWfyO5YnZq4-@hH_(4eWU{n<(~=9QH?q(O6P#f}KY z{p#s;JrQ;4#5~F9`|O_YpcRMKLljlArRS6zQW2{}p!qBGBUx_C%0%LqHdHTwiRz89 z%FdxD2hpll?zBfF&Tx=B!Qo$rm{E4==fUbZ8*1wKtVvI-^F9fL+Dxp8up47q2ee8O zHR>U0d*wCA8u+w2el&?ROnN!WWDtBsRUa4F<;|GYux80i>dU0deP^mnlw5hY8dD%? zz2`1&aQdGP8|#9xs1G5 z#dnmZzP#miTL80)I$`+ysDyF<9hnNV{k4Pjf25o1)f#9HO8tjey5Fu|70X}q0C|>N zcj@|paeTcFXHlXpkt^^iz!qjJ7grP!OrbSy;8(+I4FOya$H0(AofM@ z^P!FhMPGRfVJ|=?$hg!>UP))XKrTQy|2hU*5v_2m<2St$6E(d{^)e@}917QO=Z0k3yZ}CKwN+lcXmq;$^m6 z;JHKeZ$`bJfQhyMngf>xdDQ(XkSR7=IG>)AfyIQ~;(@}6g4m;1eBX&jPk&EjVPi)w zQ9(|s*O2TUBEyE8QlzBaG+aAOOq0(x^gJQt1Pb$17!EV5%7xh#HAs$$eC z5Hv}3r#3DaPNS{*J`3nxY5m=B>aG2g(Zm^SL9tEDdmLH$p1Ibwveg*5UL;GZOsP4m z1tIl)i-fSrgH%9#z~G`3)spwhl`qcCpb^5;L=ST^baWg?RICG?YGO#;@ndDJi@&{2 z9%J%|2$J=#`DywxitP&Y4hvt$>_iQ!%6n_Per%v-+LUEi3P1FzP*=NmjVm%hx zTDAPgcsSpT=c7ZqyA~#?z_$VvJQHl&GH%0;UjgZR=^z5hcGSuS=*i%B1N#tVWXMAp zBh~2Qa%NPFnc^#uVkXa(7H9T0Z!jYyoB%fvEJ2e*m&Ky8kgFspvt1_C0Cfm_-rJ5O za%kB?>#VX}@w7zdL{2xT<pM10`Gnv*ka&|NN+ zr@NK7tX3EcM2N$}`b&>ZTEl{OV-tvXb%OgJO27<)Ig*qDxMzj9RVSOQ$lMHZGXou& zZ4uImtSCWdInc8qb7gyu0FXx#wCD?+WN3!V)p;U?P0tyCS*%)H9^rbS{C)M>JV`l( z@at-<7Mwok<93;5t3F<4dH55%Wos7c9069S94}K~;|fRW=T6b)0hBS+Y5; zf^N|6;MyeAv=KP@;_Kgwn3ayblupJgQ4P`bt;5iViy0-(o=!v*UjrawoNmCOWDk|C z;>2yC_V@cOMN1VOBr=T8IW~jp=mc5vX;5>M&6W$8pLU(kkgz}yAS`{?qwgph4GoUe zUkFcm*~;T!eRVuZ>@#AFEVrYzt1&gMFCXTD9ILi)2@84W@;`vL*(| z%6Mu@Gsz;7P!=R`g-b!Dr7osoIq|>ymBdmqm%p>&_44GPLzu;{LlVY6K3e1)RhEXb z6Z81w3VDjH>s%9)MQMsqJV>*G0QX=VV+raa-Aa0RM^>puBW}f`FquCVRia6sZOcx| z=@s`xvB3cC;V7VM{{<6I*%{JAV*21QpATEH=G;=lUn$wn44E0S5b}X>fPK@Miv3=OOaiXbH!A=% z)P=Wc>T|gu68Dw+c|0A%SfBl#6egz0n!BpWbW~$4s|vsa6G%&SNOdrTP|xpx*Qc8y zxjviwODBB1XUaLp4C`<>l|iZWCvrQGSm@<*Z%e=Kf}LJ0tpRYQVlg^NX0&0dRjK=# z2q}I`$8hagFwDM$J=^gL1+KMzU|(_tl}j0Z0k9*|_>7ym0<}(MS_PlHEx2cXU0a*$ zq5l}k#GZ=%j`@_jH)tp z{oeQn(5ZDz1-Sn^lX3Y(lc4|>+xLGyV)rwSW+#|S7$sxxB}C7^?EZ4U7V5T;mnuiB z$_A}1k&GWndHCv?sQCxF*L11zXZl6Pr)SIM;VH-`ir$+tL`nAInVWlWd(?}KtxYEC zTCJEZVJOPBpdh}@OJY2uW@?>!{gwQpiz7i~v57W$WT#yuaSF(cMtfQEt z(+*iApQ40RtyO zu~1|#{q~y)vRNd2;)TW^QSP~~DsHHn>t6uW1Oq`*fkSe~D}j5xelEhzl<`V=(DF1G z&ZZAiNEsdje*{7 z3+y`>{jO4Ct$#?*2?;-ZODxWzMOIXiisy=d<=8&*p6?4ybwk=Us(qcYz6`xy^qGIgi8VBKg(plL}ltr7++ zOj~(c3VWj+i*Z>$E8Rlv1mlF7wawinIcn7;9%`LMUFcNwPWa!pWfUhNuP%xILl9)P zHa9fIIk751uLToS;U7S#WQp1xRLiP2xQD4`!~GjXV|WRwd2FDTRwD6hwy>_ z4%2tu!g&`*_>f5m&+rl!1~pau=J_k;QW5uD?k)nM8;#^>AzvHpu&+AjrRzj(H9?zA z4=fJ#%09}zPB76c~X72CW!4T34ik}XfJ!HBrY3u=GhdRE8)v3G* z7>#_j2c=#(n~l@&zfTx%0FnyyN$j8c*LuIONlt@-0wwn#&!-^lucgsnitjXAPmlhR ztUbNq3;teGv6aG?7g;2_*2>_#Wpm{96>BJYPX2Z68_oQ^W171C*h>EBD0@0AGEY#8 zO+iE)v3-x?Rnh$?idGa9h4b7r0$_p{vSjK(k3r-S_bsNnYClv>9BkNni$#;H8tK1# z;^r^3xfVI-R(In}3NMW$*b;?%zKI`gG4b!rThA^SoZzkig?_9W^muo*vW^v*_n~>! z{(u?uaw&c>q-C32gY@9uF(KHDX&nB}3tWoo;=i}ojzr}(F|C+pal z`2%hCk(8ZI3*cixltF3fx3tdOpX?>!j!H47%3i>b&mkL?q5A>4jUR|7-RPekd9P$m zU|sSHo7^cme-?FZv=3ANVcPMDYK4=`-Hm@oJ%$ijXXDQrLCp02yiYLpErQWgnp z&=>qbpNOmTUWcV0aPNZAdPrU;ySJ;0geW&A*vka9q~!RRwmn4nr2!;rd8Ye$hHQ{Q zz54_e>St<4Kf2Z`Iq6VWe+|ABQ?Ep`Q?&Z*II0b9e!q)sDF+}-pfb-aJ1jhcr zORY~K+7SIRB`$Cf+PQCFr4at#hKkuoabXM$6_dZw{wdeUEfyxMObx%CR16P z6ZUnXb#%*)@G&sXSyGXR$t9J%{3T_m^Q6SayMb!s*g)-VD8Tq9t15FS%`1#Gyaw&q z!d7{;o5$W9@kswp&q@uY+%o6>JQ0QjPoH3Dz~*)uI5}%=4ku`4KS~DM;>C%b8g zTqIaTQ5C|%oj*nI7x}B?bhOP2Z#qjO3j3}Cg-}Lyb{6l5hso<1j4R4kS`yoS2b;k2 z291$dv-TP>Wk&h1e&s~$b-Ld<)Yri9hjbo`pSiEYlLePNFvCoqJgu}9r}4x|bo(aZ z6w(f*)n<7P^IYQt{~}&{H-YX;$E26-I5wRt#FR~0FW()}n+OwHJvf&t$b{e1s^#g5 zBHj-nMM(%U;Lvw9M61dp^oIU55ebg#C+f~s*m4!EBYEQFL^g|Hw%7cxUPBBPla)TxH}(w|Z89BZ5sF@Eh< zzZe|CFMHJNp7<);&%P!FHFdWdVVZuRkE2+LZ;^Wli~2O*7v|PT)d%+*x(cC9B?7_h zJ{cAW=lB6}MnuM2Oe{6|QksEvI!_TLBb90H&xs7DHVDG8fPE8>^j;^5Nvl0h)y4p{ z5#fnU+T)r6mY;y;Cc=5h6x;yooBC9%;IRFAfg5u~*d#)MoXW|?qsNCgM4|t0ldN*Y zQRIko4eIIC*ds~1UCnJ1bv^-?FYo#;cWeaH5-hUGnyXE3r->wJyN(A!iTORiI)J|r z8-nw62RuH}wwjy@6tVhlU5M2bh;sF|@iTr+x{YK~ly$tDpW>A-Q?5mG9^?&y?eLyQ z%P{hKV*;xX)`ehe=Ud|A1`{F$ag5MSGbr=Iy|K@E&<7xLAX8*kBf7jOw+gjppQm>m zuyf}+GAH2J>ISAA#J>)B#DqVW;=u6cf&IWW5$}75Ivb3~_D}}?E4*Rx>8EuW*A~qN z(}eN%RBvGP@E+(y5`e1l9wECWB!DOACUdqm4HdO5q0*4Hozg; z+EjeGg1{W+wABF~CyrBpnQ=t`EU9&o+^!?@#s=VL$N(s%8@BjiH#fq6444tIwuJo> zfSbE?v#T8dTwO6TC&oYQWn#1 zVVq)Uh8#Ts{N=)tlv9v@OS*u8o|@(tVe@0(W0l83h{6x9-&YiLEuCL>M&d}FO{(6R zcj2agGaA{qJufWCu3j3V5r`04&+scyY(#w#gMPn7Qy!9YP(@1ELLV26SH=%yn7!Nl zXMP^s3w<(BbZ3%%vZU(EB;fvgpZ5D3@Wy{5Ty?kPK`or^RAol#%A*r8 zDGo!My64Vi6Sl*2(gxA|n%gF{_9bG?b@VnH}!xq6N_C`V#>eqTkH z=34;II4Cwk#R5GXc}0-rB^uG1>H^;tf0(azQ}|z$jqo=oWxZGFAp?zv06THTtYa>)d-~Su` z0!~4gF(NJX`P~5Kwm~Mza21+%q9qvEy0^&1Zo{8J^L`m_E;UEOssr>6j9GRegsl$* zXa4|Sn-4AE3cm~P>WJ_o-I-y!3Uu#jprQH#^;g*_&Uz8YO&4a3@=1%F5%lNgx+~28 zb0EZ~vL0M*dr<(%9<_#inZe%qhr{Vy9jwe;-JOxDXFG*sym+L}VB&ttX^4Irq{e?-rd{>4 z2pA)V3IRiNLl{*SpZSUDAFT~62!iXom7Z$z4>tRMPTs9ZPt<1d%j>r}wtFf$_$Xl;IVMgX)Mf$xQ zLLG$4aorq<|4#n)vHpy>jfGh2Me~>bzLf0ccsz5k8xW?f*f-AHBYCB6@xd{FE;-VF z57kE^z`M``$+@#oV^eEmS0H?y#Zi=c3S9{bb1WP&U5WDU0+Sr$-p582zX%qFsB1P^ zE@E!E({3G+h>XH^G5%C8KeN%ai%%(6$sn6rB>>~o#4*>8?hQ<5b)u_hEv*cdlUl=M z@%J>CQP6{VJW)2a>#1LAdei9b3zfB|048^GsQ(MOtlPy*f>ycobK8z@gb^`>klloEmR#_FBQrN6Rv@+$d4eM^bP1JKuHKS2GJi}Nir=U9Uns-l_frp#-K-x6 zV}S9j94efKkArIl0?$>7u9hd%-b=g7|4QICpp$MDK)Y=Y>TMmang>Sd zQ(GBhkwJ$QJjc8HSu`e=62Nq_>KtlKW$#E?DaW!C;iukI)mu!gD2n6no05WJ=Lz5f zQF&M=P_lUJ_&ml{Hx40Nctja<^9odECdxpjKa)wmg17oS>1(d+=QcL@KVjz#^*-~z z9^cxsM~lEA->AhU+~Q@r^b%&^-5!8SQzF97N-AD^wmFY+&7Z}OC=5- zE}1^Xo{}lXPuCai_^}KWI34-W%GT4T%6aKmzn_xmlyh6^DGUD-&ys4sftqP5*-)?V z>5wWo3eEp?+$uRmXZdh;Gzh2j%_Vw*qS-Y)zS$0zU}7Xh-ibw{fRj;B3l~1KVZR1q zv1G59ubf_krKhCr*_@Ap-Iw&fe&fDV42I^6zC5OR_0dwSEU6Ob14 zk}t7n{Ef0x<>2c>B>7$|gv~%nRT9GjfQA%!R!h2zf(W?i60DVJ_re*UvnZJZQVVXX ziz}=?^++@~HwdPp*_T41{kg=iPEz>#^d_DN#-75X>=-FN8qnw#8B2vsbkdQOGPeAgHAp;hgkl<*~zR6F8cFm6(}U*6a1Q zVLp7fU&B(NIzRpjNYbeb;p~BQ49nkde_F%;C2M-$&6qIR5Pm;LT)ktT_sstCDk6?3 z^{e6q213>Z7c7ScDEefXvi3Bpm|z)o$SP^KI+rzF3@3|u+tmloiTfgTtlbVE*ND#W zrWuY;!Ov5C6x}EjAMbJdc@9~g6jI7IvYxxa*I&^wF1w8vxPd!8##bO}t^7d?56p{j z8FB{pP}i|{(6QJ*Ux>vxZBXna5BnAp1(O^G7%+b@%c;C%v#4bsM<(U$zl8xlRR~B} z*r+^-q1^@uAgBQ#vP0(5+stg^Gy)kOw8VgYC4#E__gA!c@^(8JoxR+FWeFv1qK+?h zl9jXo-S!p-clo8W9X6Ijn~ww82-$#rzBXqQm${yQZ`Pd%#58x%Bxo>G>k(Y{hKve; zxo<{pv<072R_QIDM2{+MSpmkl3t7Zphc`a)Pv%w^ecn(&m9R9!lwbKlUkEoY2#aY( z596MZ#f}Wab;2sc1K$rwL0T94jXNROy6a5y-9dmciNK$adKHS6=le9NLqb2s+BYAO zN0blKXCs-yRuXW)4(lsUQ_S|kLVS!IZAl!2Y~N`@iqd6IwBqXg7+*0BU#UKP&S;}F zszUD?O|an-!0@yJNx)P@$+BK{hNCl;fad&PqbR<`6_d zaz8W&IvFljWPL^XQv#99GqsoEG8?6=l2@i)O?HwU6~L?|Ldz0r zLcN>^=k1I1RQkRscFJS=$I0mfchlh%3Fyj>RP4fNt&vtitE0w#MLL8UGy$L|9JJ^S zUKu>&%``NTble#oeTMy|ry}F&;ez&2WF3tnj|Ncou)wQxnXF65H2vCm*~QyUld)dh zA_(4?x?NLo$Bq95qIEA!k3Cr1`zDJmniOaN^N!Y)z_L{~qOoA6up{9J9^btD>-2Zi z9HL_1O58+__bEYRfU3mnd$w%6jLh21*2-K=c&vIp{Lq4jTR(yDBeL^ zx%do6Qj^TOhvt3uFHwne(owk2cY^yNbme~NI)m>jc%TQv4s&~0o3XEyaN-*3;CwDa znDEqb9LQdkV_&7k6HR{`d0YL^n{Hg-VrE4op}R4dB^B(ouAi432?7| z^IWWCx}kz(rH@YMTJ2t{-ha1_+r2iOMpbtWqT{*7)g@~A2+u>#%xeJVCnG%bMOb~7 zlre(>RuvTK>*wh;BAiq#=yGvzfzvhm;}dccEekvX`*=CwRC) zlpvfjIxm6 z1^r0vU@&fVa`A96a9L1>dgH$08B@&^nDqjS4x zzMPw{S98?o==*GbkF-bV{T3gi^#*6?`ptfiw4dnx55J@I;N$cCQ-3$tfAjtLzdz|> z9V_H=PfVo<{~tiE)1%+8cp#jrDX&r{j?|v;hL=Cfjjwq5b?8M=1Or=qSkCw3NIv=> zErCdggc%!mSlmhSC(LytnNpL+U-aqIHM^J`b;shH4D9xCZA_0&JD>lBnzLSX9Lw|v zSK9p|-J-$#Sk$`1JdIti$!g*8)Z9$J=+V%(&M$TtoyFpx-HnexKPT6sT5@X44PS_k zt*Qc*m1@FEtreoZ1K)O>W^2aiS@GUiD-z7!4R3=&P*o&>$w2L6PEJ&r-GsHe<^p%K zx%FD^m`(`DT%qW;LoZI|!X%SYPHMk|?<%?~GuvfhgjS%`+{u6=iFCyJ~BsIStLb zE_W@N_f#E4llHVYRS6-rCCbIrA2wurjP{BQ&Cqk_ERxqQEZnR>$Pxv6k=gHY$PZ1^ zRjlb0UN?k`R(nl)OA|wtt4EZrv0RfLw#bDIQIoU(4bCbyBp1|M4lvoQpmdt~d7Z(+ zyZzr8rap$xqS|~7O`td6r;Lvl@YZ8q!iFriuUCK-Z(oHFKp`5tewkN@(bqcdHm`O& zrW_I>H;3x?;o&zT@J>&VhpeRJcWY7K_9KlG11%XNGYwYtwZqlaNX0}d-q^}nT9MK9|a_hRtk_e?RToI{Qp7P-e ztv!fc#WoOP9ohMSKedz}nt${2pQ;sghP!rkn@pf#LCLQM<6U4%osio5*}jzlcA#*nb=W>(Szw`kXf(w7SABQheKF><~Uf@51yvM&HR|k-%0s#hT z2D=oEq<|^rj2(kBt@Ca;;uI6c3BsS|$;Iv!#&sV6%I>%g<$^YD3mEW=vnUpCdT+d4 zZ8Y~_7>|FLU$~ z;D(IgPN@j^u@e>3iHd@T_sK=N;l z$GV`3cplk&6w+c2A{l0*HWO!v$35o=N13%O-aZRKfvHid?yFpo6t|1x+(h)}MMxSp zJpKd6@~s;@%Z6E?V%m>PV=&4L39})L$lMODwIp|xFn+F=bYkTD&c@-7o3^CYz@sK> z$fvp>rpPtkAz*WP+2`(rm-9c9qnG*Hy(XB*OI`VC`~ME?ZyDB}?2=goLlfWfsmveO zphIZR>8fjr{tI4guKLBpH=4myf%w^raHt=DmUA&w=^CM^^s(k=)$HOK$;znMEX`Da z51^!;v0}9`2Pu3Ev&-`h9{3S8V9DKqtC%Rn+e`c2)IH2e?<~d|8(#dR3jMXxz+pn7 zUblz>c~8(LR!}-zW2gjyQqJ`2xSJc$Rw8$j&0SFlI=Rcz#Jdycu>$q>I+!RKXEzmXzW{pB-S7KAnGITgAsHrJ>1XdAR z-6;bk6Sv|j`-#&_n6-aR#i^)NvwD}t#h0$J%ccK1<(K+&Fsl_C>Xu`L8>`qHFlh!o zQObf&YeupQ2l38nxUfX;YUDIJ%YiI6Ozv9Llqv`C>P#q^yJ|UcVI#3oT9g91S5x+Z zH3Yy?^dbfQFE4UW9`r;Oi)$gukD4wsWQb&9*WMzi%~>QS9Lmetl)yv}NW56Zy{r!uv@XN6U@=-fjTc`kPa^3^fjt(#5B*1^4qKL||cPT(TuGss44 z14nqsc_sl5&BiuDl!P5pe2jynkveJ-IqIP7cm!;Mi=fdeuHv7P(2=%rDjwkB%w02% z3IpOB`XWl;qH6oRpqsl6VoPAM(}ZA{UUnk4383G}E>!D<6k8vryL}XRHGOyjKi$A(& z)?JMB%-;i$`m9GAJ22zLKwBR#e0G`k8*ueed-Ko`&Et<~G<&xj=%o#@HQ$9xl*|NO z9x|l6mx@o6rtY*lIOtuEQHyFJZ*a5n2nilk^GNeVImxf*rM)b$4kyjL_E~(7ija@Dal6^ty3GO!CF(F zSE-35)TBd`E;z^j^ZwTWw9!bI7QWd{XV&e4pk1)K z;n0xU_CBdjB;vVK9tN0}!~H%2-yUBhk41|Hr95>I$gX8(31y(&X}qH%`O(6QUq!qD zQFp54y2RQ0JQc1#g-`HUHopcxne$a&UHUYW#o1Pd9?J4SW; zE^Y-YItPyr$=!qbt-Da%KI&=d0Rod_HRzzhB+1H;E4gk-eW``~Sl7Fy4m+%ix_+pa zg_etVzzxuY6@_SDC*H`Y*;m)Sj=3vkc=%`%mMM$aH09TEK}sebfd)Ta)&^pPczk3+ zdfgeH6D}(rKf*$)si>kvy(NypIWvtH)kbQM?h?zq&}wxaVla^=ui)!iok!dFW*Vdx zirwi|BjQU{XwxQ94L#G=5>=GQekC@&Wr-Ed^*HQ;bH6F>5ND#2jr z)Ek1c`Us?gf_3idtvFtx0tlm8S$f673M%`H?Ov4ciY`(LD3^b1fyC;W<)1;iX=Vh5 z0W}{nY2eSDyG|V}{h9YOF}g7qu5o&=(uUsBWAULO>R@|oUWHE!Ap<9UP|I7S2S6(W zbpjBwSC)76Qhl}W{!I)~3lzE)l|R+D{IXk4jQb@DLHP4sLyT z%P}zY1p>lAHRzZ`ahDC<(6=z+QwXu_a{9F=I!8sLEGYAF5^M*o=;Our zR^wT8%A3K*hL?g!jXd)nlJ{Pho3e7`Q1}=-sBBO=cVd@y)W(!jEOY?>73wmL=yC`X zsZ?B>R_;UDB}uLqb05fOML?~?NsV#Yz;UV(;rw_k%VM0ZhYN;YOe}XuJ}7YLQ^|{Odz8g?s`tz5N{lm7CzpfHaegk2p_c@X&j;Qn- z{?_F){n`YWBJRESQ!|4hl#ITg>J)$Ep0`u(Mfx$-Nm1f1^O(f(Fb_ebl`i1#I$qWc z5A`HT_AQ#0@=50 z^SZCY?xR@-0mpKmDBq@>r0IJ|{~$pwO>1T0-iIp2fLch7Px)yAeTQe21Ad*Y-?8hV0*y&dMnKdg6bF!nWKU-)OUVvvn#0CBk`U|IQiQUolz<#M3y z!`(`E5>J)3;vbE<8y!p5n;nQRuf)?s)Ozyfk*2atO6WUU1L180-ben-jAercIP%SX zdR=HhE=g1AL`p)b+I^$*yd7IMz^Zf<=vgP=JS zliuUmiwsbwP!&UT`VTzEd}L;sHPT*2OPUGga^(xzr z(8z?Ko?oGk&F5TFW2I{ibpY=699%0b13pI0;HW8Bk{q#|T?QX^_Ivkj9K|_*4hUfy zT7QS)JYjN!$-_kApBh(_Z6Y}?_#{#}fD@i_M?(5GYo@FHle7b~s~Jznci^F))&LHO zDI#@eXAc<0PDW*<<9Vv)4>0|fB2M5aB|4AP1ZIghWxCBo5D|&Lfg@PNZDBL@>t7DW zzFU!}KpT9GHdW;Lzr)-#?=Nt_(4 z`iyCDJw`Rq)s~6D)kS5%cQU;0JXxZk1`x>$;=CtE$}?$x!Gj8})%_BS!7UJ#@w|v$ zrnhG`fNjsDm%gHO?3v);P89RaGM=dGM`XTze)f94C#4W|HNqgN4N-JLq~JiK*efoa zgcgD1u01$9r{QG59+*GW6TQhwm5>g|pNy6e_SA(^Mi)4!S6n91$tbO)WBtU`fn@t@ zcZ~1e15pUAcIKQ(=*awNo@dVhobPMJWkr480aSz-YIWPepB*wto~9 zO#djzd(4HGrt|3_=WQw=26Y0ipn?7zw0T_U1zXUcX2ex?^#yG<@L{wM^M9!Ho23>h zO77Kg*4&buN=9!b)3ZgH4;(376=9!#Z%^I?qT+cM5F1JeKBY_=d7#E~84#&jqM-0CfPc7u-N)_OIgimhyX@sLDnl=j!I zYjrd}0vt)0q`vvuu!7!-bmaIBd9lTBH}TZ8pFE}6G`Z4FmJ{DgTEregGrFwFP1I$? zQ>}2Yw>=xJ)AwVeiBPAne?j!sp3nRG{Pd;3LsT1)5qa5S^ww!@We+7MdVMInME8o` z7{I(NFv3vJ?YH!8!zVrD8?16?z81ETU&F!H1FYI(T0tXBJxit^rx&4!WBXX5@axguH7c`5FYIgPrYn5 zrf*v-Kg2m(-@5ZsM*ndMiG z=a%7=f>!#P1Wr(KgLsV0R4TtP)`_t>LVxz>f2`Wz;*T9&A|+b7ZL=`yeNXfPc;(8? zTg0PljuJv@5E^@bPklcAkdmp5eOCHXR-j@^Xs8_cLDLzcF11#aT{Un?jSaR>#matb zJ}t!d+x_PN;A-;_W4-XVJwt}LkTnh)at?baH#OKo#KS2wUqpfjK(k>GNL(|6AM@BT# z^ipi=$(dVy$`gc9`4D(!vtO=Fth?_-xyQ4UHnDPQJ0D4sJ0@~}G|mE-t+z5PvfpmUr-r(e>xm-L!{CJzGO@$ zT8`Z~XeX0K+1CKENS6^TbfQ@Gh<&%;!LP90>!Pd!<*B>kZhwT zdgG2sZr7eZBTan?TY~>=NPQN65Dk`y|AACW%;)q9^ZpWK)}gczqt2C%rAXK%sbR&@ zz!5jAKpweXj``7RgR2e-A5(%B>Rw2V>|`xt9H# zQK6+tC+|ndbKRg}-=y6IQbe*hq35|_h2uRCctuQK*b5BrVXi;}fyp=3hAg1mau)?Z zg>#;J?9|_#rw}TAiVO;V%{a%Qt1Yl}y?=N>@_;Gumk5vi_c1{_0P$a3mi3OuGZ+w_uEes+n5uPSy@FwM)z!6femr5 z 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